To throw or not to throw an exception in C#
Possible Duplicate:
Why catch and rethrow Exception in C#?
我一直在搜索网络,试图找到这个问题的答案——这两者之间是什么?
1 2 3 4 5 6 7 8 | try { //Do Something } catch { throw; } |
VS
1 2 3 4 5 6 7 | try { //Do Something } catch { } |
或
1 2 3 4 5 6 7 8 | try { //Do Something } catch (Exception Ex) { //Do something with Exception Ex } |
第一个将异常向上推送到堆栈并保留堆栈跟踪。
第二个吞下(隐藏)例外。
第三个可能也会接受这个例外,但这取决于(//做些什么)做了什么。
catch->throw实际上只会抛出错误,因此您必须在其他地方捕获它。如果您想先捕获某个内容,然后将错误抛出到上面的其他方法中,那么这将非常有用。
例子:
1 2 3 4 5 6 7 8 9 10 11 | try { // do something } catch { Console.WriteLine("Something went wrong, and you'll know it"); throw; } // won't get here anymore, the exception was thrown. |
而try->catch只允许您忽略错误。
1 2 3 4 5 6 7 8 9 10 | try { // do something } catch { Console.WriteLine("Something went wrong, and you won't know it."); } // continuing happily |
第一个则重新抛出捕获的异常。第二个则像从未发生过一样吞下了例外。所以这取决于你需要什么。
请注意,这两者之间存在差异:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | try { //Do Something } catch (Exception Ex) { //re-throws the same exception that was caught throw; } try { //Do Something } catch (Exception Ex) { //throws a _new_ exception containing Ex throw Ex; } |
在第一种情况下,异常会重新引发到调用方。这个版本是没有意义的,因为您对异常不做任何事情,但是在实践中,您可能会做一些事情,然后将异常抛出给调用者。它在过滤异常时也很有用,例如
1 2 3 4 5 6 7 8 9 10 11 12 | try { //do somethign } catch(Exception1) { throw; } catch { //do something } |
第二件事是你不应该做的。您正在覆盖一个异常,这使得在应用程序中捕捉最终的错误变得更加困难。您要么需要以有意义的方式处理异常,要么让它破坏程序(或者让调用者处理它)。
第三个例子是简单的异常处理。确保不要将其用作if/else(流控制)的形式。
在第一个块中,在第一个块的处理程序内再次引发异常。这意味着它可以被外部的Try/Catch作用域块拾取。第二个块"吃"catch块中的异常,执行catch块中的代码后,程序执行可以正常继续。
首先,您只是在重新引发异常。在这种情况下,您不需要Try/Catch,因为您不需要对捕获的异常执行任何操作。
在第二种情况下,您将吞下所有例外情况。这是非常危险的。不要这样做。这永远都不正确。
最后,你没有给我们足够的细节让我们知道。您正在捕获异常,您可能会对此做些什么。你可以再流,你可以吞咽。你还没告诉我们。