Javascript尝试... catch ... else ...最后像Python,Java,Ruby等

Jas*_*ith 35 javascript try-catch

使用Javascript如何能复制四部分try- catch- else- finally执行模式,其他语言的支持?

一个清晰,简短的摘要来自Python 2.5什么是新的.在Javascript术语中:

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

执行Protected-block中的代码.如果代码抛出异常,则执行Handler-block ; 如果没有抛出异常,则执行Else-block.

无论先前发生了什么,一旦代码块完成并且处理了任何抛出的异常,就会执行Final-block.即使在Handler-blockElse-block中出现错误并引发新的异常,Final-block中的代码仍然会运行.

请注意,在受保护块的末尾剪切Else-block和粘贴是错误的.如果在Else-block中发生错误,则不能Handler-block处理.

cba*_*ick 33

我知道这是旧的,但这是一个纯语法解决方案,我认为这是正确的方法:

try {
    // Protected-block
    try {
        // Else-block
    } catch (e) {
        // Else-handler-block
    }
} catch(e) {
    // Handler-block
} finally {
    // Final-block
}
Run Code Online (Sandbox Code Playgroud)

执行Protected-block中的代码.如果代码抛出错误,则执行Handler-block ; 如果没有抛出错误,则执行Else-block.

无论先前发生了什么,一旦代码块完成并且处理了任何抛出的错误,就会执行Final-block.即使Handler-blockElse-block中存在错误,Final-block中的代码仍会运行.

如果在Else块中抛出错误,则它不由Handler块处理,而是由Else-handler-block处理

如果你知道Else-block不会抛出:

try {
    // Protected-block
    // Else-block
} catch(e) {
    // Handler-block
} finally {
    // Final-block
}
Run Code Online (Sandbox Code Playgroud)

故事的道德,不要害怕缩进;)

注意:这仅在Else-handler-block永不抛出时才有效.

  • 比添加一个`success`变量要好得多...... _unless_你希望在`else`块中引发的任何错误冒泡并且_not_被主处理程序块捕获,这是Python语法允许的.如果这就是你所需要的,没有某种"成功"变量,我认为没有任何办法. (3认同)

Jak*_*kob 26

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();
  }
};
Run Code Online (Sandbox Code Playgroud)

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
});
Run Code Online (Sandbox Code Playgroud)

  • 这可行,但你失去了控制流。你不能从 try、continue 循环等中“return”。 (3认同)

Jas*_*ith 8

Javascript没有支持无异常情况的语法.最好的解决方法是嵌套try语句,类似于PEP 341中的"遗留"技术

// A pretty-good try/catch/else/finally implementation.
try {
  var success = true;
  try {
    protected_code();
  } catch(e) {
    success = false;
    handler_code({"exception_was": e});
  }
  if(success) {
    else_code();
  }
} finally {
  this_always_runs();
}
Run Code Online (Sandbox Code Playgroud)

除了可读性之外,唯一的问题是success变量.如果protected_code设置window.success = false,这将不起作用.一种不太可读但更安全的方法使用函数名称空间:

// A try/catch/else/finally implementation without changing variable bindings.
try {
  (function() {
    var success = true;
    try {
      protected_code();
    } catch(e) {
      success = false;
      handler_code({"exception_was": e});
    }
    if(success) {
      else_code();
    }
  })();
} finally {
  this_always_runs();
}
Run Code Online (Sandbox Code Playgroud)


小智 6

我知道这个问题已经过时了,已经给出了答案,但我认为我的答案最简单,就是在javascripts中使用try-catch-block获得"else".

var error = null;
try {
    /*Protected-block*/
} catch ( catchedError ) {
    error = catchedError; //necessary to make it available in finally-block
} finally {
    if ( error ) {
        /*Handler-block*/
        /*e.g. console.log( 'error: ' + error.message );*/
    } else {
        /*Else-block*/
    }
    /*Final-block*/
}
Run Code Online (Sandbox Code Playgroud)