开发者

What does "throw;" by itself do? [duplicate]

开发者 https://www.devze.com 2022-12-28 05:47 出处:网络
This question already has answers here: 开发者_开发百科Closed 10 years ago. Possible Duplicate: difference between throw and throw new Exception()
This question already has answers here: 开发者_开发百科 Closed 10 years ago.

Possible Duplicate:

difference between throw and throw new Exception()

What would be the point of just having

catch (Exception)
{
    throw;
}

What does this do?


By itself, the throw keyword simply re-raises the exception caught by the catch statement above. This is handy if you want to do some rudimentary exception handling (perhaps a compensating action like rolling back a transaction) and then rethrow the exception to the calling method.

This method has one significant advantage over catching the exception in a variable and throwing that instance: It preserves the original call stack. If you catch (Exception ex) and then throw ex, your call stack will only start at that throw statement and you lose the method/line of the original error.


Sometimes you might want to do something like this:

try
{
    // do some stuff that could cause SomeCustomException to happen, as 
    // well as other exceptions
}
catch (SomeCustomException)
{
    // this is here so we don't double wrap the exception, since
    // we know the exception is already SomeCustomException
    throw;
}
catch (Exception e)
{
    // we got some other exception, but we want all exceptions
    // thrown from this method to be SomeCustomException, so we wrap
    // it
    throw new SomeCustomException("An error occurred saving the widget", e);
}


It rethrows the exact same error, you gain nothing by this.
Sometimes you can use the catch method to do some logging or something without interupting your exception like this:

catch (Exception) {
  myLogger.Log(LogLevels.Exception, "oh noes!")
  throw; 
}

I initially mistakingly thought this would unwind your stack, but this would only be if you would do the following:

catch (Exception err) {
  throw err; 
}


Only reason I can think of is if you want to put a breakpoint there during debugging.
It's also the default code being generated by some tools I think.


Simply rethrow the current exception, and that exception will keep its "source" and the stack trace.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号