Allow ProgramExit(0), add some comments
authorTudor Bosman <tudorb@fb.com>
Wed, 29 Jul 2015 14:48:48 +0000 (07:48 -0700)
committerfacebook-github-bot-4 <folly-bot@fb.com>
Wed, 29 Jul 2015 15:22:12 +0000 (08:22 -0700)
Summary: exit() is evil, let's make it easier for programs that want to exit
successfully.

Reviewed By: @meyering

Differential Revision: D2290201

folly/experimental/NestedCommandLineApp.cpp
folly/experimental/NestedCommandLineApp.h

index b468f515c5c1b16048a56809a3c2af56a4e3ae80..39055bd69eaa8c6dee00b377fc0a62e20e68a5f0 100644 (file)
@@ -41,7 +41,8 @@ std::string guessProgramName() {
 ProgramExit::ProgramExit(int status, const std::string& msg)
   : std::runtime_error(msg),
     status_(status) {
-  CHECK_NE(status, 0);
+  // Message is only allowed for non-zero exit status
+  CHECK(status_ != 0 || msg.empty());
 }
 
 NestedCommandLineApp::NestedCommandLineApp(
index aa9d061f910f127021127d6b3d124227caf34c9b..a34e62cfe7d976fb9a07d635dba7e507a64d6ccb 100644 (file)
@@ -26,10 +26,10 @@ namespace folly {
 
 /**
  * Exception that commands may throw to force the program to exit cleanly
- * with a non-zero exit code. NestedCommandLineApp::run() catches this and
+ * with a given exit code. NestedCommandLineApp::run() catches this and
  * makes run() print the given message on stderr (followed by a newline, unless
- * empty), and return the exit code. (Other exceptions will propagate out of
- * run())
+ * empty; the message is only allowed when exiting with a non-zero status), and
+ * return the exit code. (Other exceptions will propagate out of run())
  */
 class ProgramExit : public std::runtime_error {
  public:
@@ -114,6 +114,11 @@ class NestedCommandLineApp {
    * Run the command and return; the return code is 0 on success or
    * non-zero on error, so it is idiomatic to call this at the end of main():
    * return app.run(argc, argv);
+   *
+   * On successful exit, run() will check for errors on stdout (and flush
+   * it) to help command-line applications that need to write to stdout
+   * (failing to write to stdout is an error). If there is an error on stdout,
+   * we'll print a helpful message on stderr and return an error status (1).
    */
   int run(int argc, const char* const argv[]);
   int run(const std::vector<std::string>& args);