Search code examples
javascripttry-catch

Javascript try...catch...else...finally like Python, Java, Ruby, etc


How can Javascript duplicate the four-part try-catch-else-finally execution model that other languages support?

A clear, brief summary is from the Python 2.5 what's new. In Javascript terms:

// XXX THIS EXAMPLE IS A SYNTAX ERROR
try {
  // Protected-block
} catch(e) {
  // Handler-block
} else {
  // Else-block
} finally {
  // Final-block
}

The code in Protected-block is executed. If the code throws an exception, Handler-block is executed; If no exception is thrown, Else-block is executed.

No matter what happened previously, Final-block is executed once the code block is complete and any thrown exceptions handled. Even if there’s an error in Handler-block or Else-block and a new exception is raised, the code in Final-block is still run.

Note that cutting Else-block and pasting at the end of Protected-block is wrong. If an error happens in Else-block, it must not be handled by Handler-block.


Solution

  • Extending the idea of jhs a little, the whole concept could be put inside a function, to provide even more readability:

    var try_catch_else_finally = function(protected_code, handler_code, else_code, finally_code) {
      try {
        var success = true;
        try {
          protected_code();
        } catch(e) {
          success = false;
          handler_code({"exception_was": e});
        }
        if(success) {
          else_code();
        }
      } finally {
        finally_code();
      }
    };
    

    Then we can use it like this (very similar to the python way):

    try_catch_else_finally(function() {
      // protected block
    }, function() {
      // handler block
    }, function() {
      // else block
    }, function() {
      // final-block
    });