Wrap the main functionality of mkdoc in a function.
diff --git a/tools/mkdoc.py b/tools/mkdoc.py
index 0b0ce3e..c690aef 100644
--- a/tools/mkdoc.py
+++ b/tools/mkdoc.py
@@ -59,6 +59,11 @@
 
 output = []
 
+
+class NoFilenamesError(ValueError):
+    pass
+
+
 def d(s):
     return s if isinstance(s, str) else s.decode('utf8')
 
@@ -224,7 +229,8 @@
         finally:
             job_semaphore.release()
 
-if __name__ == '__main__':
+
+def mkdoc(args):
     parameters = []
     filenames = []
     if "-x" not in args:
@@ -260,15 +266,14 @@
         if clang_include_dir:
             parameters.extend(['-isystem', clang_include_dir])
 
-    for item in sys.argv[1:]:
+    for item in args:
         if item.startswith('-'):
             parameters.append(item)
         else:
             filenames.append(item)
 
     if len(filenames) == 0:
-        print('Syntax: %s [.. a list of header files ..]' % sys.argv[0])
-        exit(-1)
+        raise NoFilenamesError("args parameter did not contain any filenames")
 
     print('''/*
   This file contains docstrings for the Python bindings.
@@ -321,3 +326,11 @@
 #pragma GCC diagnostic pop
 #endif
 ''')
+
+
+if __name__ == '__main__':
+    try:
+        mkdoc(sys.argv[1:])
+    except NoFilenamesError:
+        print('Syntax: %s [.. a list of header files ..]' % sys.argv[0])
+        exit(-1)