diff --git a/src/command_line_options.cpp b/src/command_line_options.cpp
index 17596ce..368173d 100644
--- a/src/command_line_options.cpp
+++ b/src/command_line_options.cpp
@@ -22,6 +22,8 @@
 
 #include "helper.hpp"
 #include "command_line_options.hpp"
+
+#define RAISE_EXCEPTION(x) static_cast<std::ostringstream&>(std::ostringstream() << x).str()
 
 CommandLineOptions* command_line_options = 0;
 
@@ -156,14 +158,12 @@ CommandLineOptions::parse_args(int argc, char** argv)
                 }
               else
                 {
-                  std::cout << "Error: " << argv[i-1] << " expected an argument in form INT,INT" << std::endl;
-                  exit(EXIT_FAILURE);
+                  RAISE_EXCEPTION(argv[i-1] << " expected an argument in form INT,INT");
                 }
             }
           else
             {
-              std::cout << "Error: " << argv[i-1] << " expected an argument" << std::endl;
-              exit(EXIT_FAILURE);
+              RAISE_EXCEPTION(argv[i-1] << " expected an argument");
             }          
         }
       else if (strcmp(argv[i], "-q") == 0 ||
@@ -211,21 +211,19 @@ CommandLineOptions::parse_args(int argc, char** argv)
                 }
               else
                 {
-                  std::cout << "Error: unknown type: " << argv[i] << std::endl;
-                  std::cout << "Possible types are:" << std::endl;
-                  std::cout << " * xbox" << std::endl;
-                  std::cout << " * xbox-mat" << std::endl;
-                  std::cout << " * xbox360" << std::endl;
-                  std::cout << " * xbox360-guitar" << std::endl;
-                  std::cout << " * xbox360-wireless" << std::endl;
-                  std::cout << " * firestorm" << std::endl;
-                  exit(EXIT_FAILURE); 
+                  RAISE_EXCEPTION("unknown type: " << argv[i] << '\n'
+                                  << "Possible types are:\n"
+                                  << " * xbox\n"
+                                  << " * xbox-mat\n"
+                                  << " * xbox360\n"
+                                  << " * xbox360-guitar\n"
+                                  << " * xbox360-wireless\n"
+                                  << " * firestorm\n");
                 }
             }
           else
             {
-              std::cout << "Error: " << argv[i-1] << " expected an argument" << std::endl;
-              exit(EXIT_FAILURE);
+              RAISE_EXCEPTION(argv[i-1] << " expected an argument");
             }
         }
       else if (strcmp(argv[i], "--force-feedback") == 0)
@@ -241,8 +239,7 @@ CommandLineOptions::parse_args(int argc, char** argv)
             }
           else
             {
-              std::cout << "Error: " << argv[i-1] << " expected an argument" << std::endl;
-              exit(EXIT_FAILURE);
+              RAISE_EXCEPTION(argv[i-1] << " expected an argument");
             }
         }
       else if (strcmp(argv[i], "-b") == 0 ||
@@ -255,8 +252,7 @@ CommandLineOptions::parse_args(int argc, char** argv)
             }
           else
             {
-              std::cout << "Error: " << argv[i-1] << " expected an argument" << std::endl;
-              exit(EXIT_FAILURE);
+              RAISE_EXCEPTION(argv[i-1] << " expected an argument");
             }
         }
       else if (strcmp(argv[i], "-a") == 0 ||
@@ -269,8 +265,7 @@ CommandLineOptions::parse_args(int argc, char** argv)
             }
           else
             {
-              std::cout << "Error: " << argv[i-1] << " expected an argument" << std::endl;
-              exit(EXIT_FAILURE);
+              RAISE_EXCEPTION(argv[i-1] << " expected an argument");
             }          
         }
       else if (strcmp(argv[i], "--name") == 0)
@@ -282,8 +277,7 @@ CommandLineOptions::parse_args(int argc, char** argv)
             }
           else
             {
-              std::cout << "Error: " << argv[i-1] << " expected an argument" << std::endl;
-              exit(EXIT_FAILURE);
+              RAISE_EXCEPTION(argv[i-1] << " expected an argument");
             }                  
         }
       else if (strcmp(argv[i], "--ui-clear") == 0)
@@ -300,8 +294,7 @@ CommandLineOptions::parse_args(int argc, char** argv)
             }
           else
             {
-              std::cout << "Error: " << argv[i-1] << " expected an argument" << std::endl;
-              exit(EXIT_FAILURE);
+              RAISE_EXCEPTION(argv[i-1] << " expected an argument");
             }                  
         }
       else if (strcmp(argv[i], "--ui-buttonmap") == 0)
@@ -313,8 +306,7 @@ CommandLineOptions::parse_args(int argc, char** argv)
             }
           else
             {
-              std::cout << "Error: " << argv[i-1] << " expected an argument" << std::endl;
-              exit(EXIT_FAILURE);
+              RAISE_EXCEPTION(argv[i-1] << " expected an argument");
             }         
         }
       else if (strcmp(argv[i], "-i") == 0 ||
@@ -327,8 +319,7 @@ CommandLineOptions::parse_args(int argc, char** argv)
             }
           else
             {
-              std::cout << "Error: " << argv[i-1] << " expected an argument" << std::endl;
-              exit(EXIT_FAILURE);
+              RAISE_EXCEPTION(argv[i-1] << " expected an argument");
             }
         }
       else if (strcmp(argv[i], "-w") == 0 ||
@@ -341,8 +332,7 @@ CommandLineOptions::parse_args(int argc, char** argv)
             }
           else
             {
-              std::cout << "Error: " << argv[i-1] << " expected an argument" << std::endl;
-              exit(EXIT_FAILURE);
+              RAISE_EXCEPTION(argv[i-1] << " expected an argument");
             }
         }
       else if (strcmp(argv[i], "-l") == 0 ||
@@ -363,14 +353,13 @@ CommandLineOptions::parse_args(int argc, char** argv)
             }
           else
             {
-              std::cout << "Error: " << argv[i-1] << " expected an argument" << std::endl;
-              exit(EXIT_FAILURE);
+              RAISE_EXCEPTION(argv[i-1] << " expected an argument");
             }
         }
       else if (strcmp("--dpad-only", argv[i]) == 0)
         {
           if (opts.uinput_config.dpad_as_button)
-            throw std::runtime_error("Can't combine --dpad-as-button with --dpad-only");
+            RAISE_EXCEPTION("Can't combine --dpad-as-button with --dpad-only");
 
           opts.uinput_config.dpad_only = true;
         }
@@ -390,8 +379,7 @@ CommandLineOptions::parse_args(int argc, char** argv)
             }
           else
             {
-              std::cout << "Error: " << argv[i-1] << " expected an INT argument" << std::endl;
-              exit(EXIT_FAILURE);
+              RAISE_EXCEPTION(argv[i-1] << " expected an INT argument");
             }
         }
       else if (strcmp("--deadzone-trigger", argv[i]) == 0)
@@ -403,16 +391,14 @@ CommandLineOptions::parse_args(int argc, char** argv)
             }
           else
             {
-              std::cout << "Error: " << argv[i-1] << " expected an INT argument" << std::endl;
-              exit(EXIT_FAILURE);
+              RAISE_EXCEPTION(argv[i-1] << " expected an INT argument");
             }
         }
       else if (strcmp("--trigger-as-button", argv[i]) == 0)
         {
           if (opts.uinput_config.trigger_as_zaxis)
             {
-              std::cout << "Error: Can't combine --trigger-as-button and --trigger-as-zaxis" << std::endl;
-              exit(EXIT_FAILURE);
+              RAISE_EXCEPTION("Can't combine --trigger-as-button and --trigger-as-zaxis");
             }
           else
             {
@@ -428,8 +414,7 @@ CommandLineOptions::parse_args(int argc, char** argv)
             }
           else
             {
-              std::cout << "Error: " << argv[i-1] << " expected an argument" << std::endl;
-              exit(EXIT_FAILURE);
+              RAISE_EXCEPTION(argv[i-1] << " expected an argument");
             }          
         }
       else if (strcmp("--calibration", argv[i]) == 0)
@@ -441,8 +426,7 @@ CommandLineOptions::parse_args(int argc, char** argv)
             }
           else
             {
-              std::cout << "Error: " << argv[i-1] << " expected an argument" << std::endl;
-              exit(EXIT_FAILURE);
+              RAISE_EXCEPTION(argv[i-1] << " expected an argument");
             }
         }
       else if (strcmp("--relative-axis", argv[i]) == 0)
@@ -454,8 +438,7 @@ CommandLineOptions::parse_args(int argc, char** argv)
             }
           else
             {
-              std::cout << "Error: " << argv[i-1] << " expected an argument" << std::endl;
-              exit(EXIT_FAILURE);
+              RAISE_EXCEPTION(argv[i-1] << " expected an argument");
             }          
         }
       else if (strcmp("--square-axis", argv[i]) == 0)
@@ -466,8 +449,7 @@ CommandLineOptions::parse_args(int argc, char** argv)
         {
           if (opts.uinput_config.trigger_as_button)
             {
-              std::cout << "Error: Can't combine --trigger-as-button and --trigger-as-zaxis" << std::endl;
-              exit(EXIT_FAILURE);
+              RAISE_EXCEPTION("Can't combine --trigger-as-button and --trigger-as-zaxis");
             }
           else
             {
@@ -493,14 +475,12 @@ CommandLineOptions::parse_args(int argc, char** argv)
                 }
               else
                 {
-                  std::cout << "Error: " << argv[i-1] << " expected an argument in form PRODUCT:VENDOR (i.e. 046d:c626)" << std::endl;
-                  exit(EXIT_FAILURE);
+                  RAISE_EXCEPTION(argv[i-1] << " expected an argument in form PRODUCT:VENDOR (i.e. 046d:c626)");
                 }
             }
           else
             {
-              std::cout << "Error: " << argv[i-1] << " expected an argument" << std::endl;
-              exit(EXIT_FAILURE);
+              RAISE_EXCEPTION(argv[i-1] << " expected an argument");
             }        
         }
       else if (strcmp(argv[i], "--device-by-path") == 0)
@@ -513,28 +493,17 @@ CommandLineOptions::parse_args(int argc, char** argv)
                 }
               else
                 {
-                  std::cout << "Error: " << argv[i-1] << " expected an argument in form BUS:DEV (i.e. 006:003)" << std::endl;
-                  exit(EXIT_FAILURE);
+                  RAISE_EXCEPTION(argv[i-1] << " expected an argument in form BUS:DEV (i.e. 006:003)");
                 }
             }
           else
             {
-              std::cout << "Error: " << argv[i-1] << " expected an argument" << std::endl;
-              exit(EXIT_FAILURE);
+              RAISE_EXCEPTION(argv[i-1] << " expected an argument");
             }          
         }
       else if (strcmp(argv[i], "--list-supported-devices") == 0)
         {
-          for(int i = 0; i < xpad_devices_count; ++i)
-            {
-              std::cout << boost::format("%s 0x%04x 0x%04x %s\n")
-                % gamepadtype_to_string(xpad_devices[i].type)
-                % int(xpad_devices[i].idVendor)
-                % int(xpad_devices[i].idProduct)
-                % xpad_devices[i].name;
-            }
-
-          exit(EXIT_FAILURE);
+          opts.mode = RUN_LIST_SUPPORTED_DEVICES;
         }
       else if (strcmp(argv[i], "--list-controller") == 0 ||
                strcmp(argv[i], "-L") == 0)
@@ -557,8 +526,7 @@ CommandLineOptions::parse_args(int argc, char** argv)
         }
       else
         {
-          std::cout << "Error: unknown command line option: " << argv[i] << std::endl;
-          exit(EXIT_FAILURE);
+          RAISE_EXCEPTION("unknown command line option: " << argv[i]);
         }
     }
 }
diff --git a/src/command_line_options.hpp b/src/command_line_options.hpp
index bb92013..958e335 100644
--- a/src/command_line_options.hpp
+++ b/src/command_line_options.hpp
@@ -38,7 +38,11 @@ class CommandLineOptions
 public:
   enum { RUN_DEFAULT,
          RUN_DAEMON, 
-         RUN_LIST_CONTROLLER
+         RUN_LIST_CONTROLLER,
+         RUN_LIST_SUPPORTED_DEVICES,
+         PRINT_VERSION,
+         PRINT_HELP,
+         PRINT_LED_HELP
   } mode;
 
   bool verbose;
diff --git a/src/xboxdrv.cpp b/src/xboxdrv.cpp
index 3658942..d34c18a 100644
--- a/src/xboxdrv.cpp
+++ b/src/xboxdrv.cpp
@@ -635,10 +635,28 @@ Xboxdrv::main(int argc, char** argv)
 
       switch(opts.mode)
         {
+          case CommandLineOptions::RUN_LIST_SUPPORTED_DEVICES:
+            for(int i = 0; i < xpad_devices_count; ++i)
+              {
+                std::cout << boost::format("%s 0x%04x 0x%04x %s\n")
+                  % gamepadtype_to_string(xpad_devices[i].type)
+                  % int(xpad_devices[i].idVendor)
+                  % int(xpad_devices[i].idProduct)
+                  % xpad_devices[i].name;
+              }
+            break;
+
+          case CommandLineOptions::PRINT_VERSION:
+            break;
+
+          case CommandLineOptions::PRINT_HELP:
+            break;
+
+          case CommandLineOptions::PRINT_LED_HELP:
+            break;
+
           case CommandLineOptions::RUN_DEFAULT:
-            {
-              run_main(opts);
-            }
+            run_main(opts);
             break;
 
           case CommandLineOptions::RUN_DAEMON:
@@ -668,7 +686,7 @@ Xboxdrv::main(int argc, char** argv)
     }
   catch(std::exception& err)
     {
-      std::cout << "Exception: " << err.what() << std::endl;
+      std::cout << "Error: " << err.what() << std::endl;
     }
 
   return 0;