使用Exception类捕获每个异常是否正确?如果不是那么在try catch块中捕获异常的正确序列应该是什么?
e.g
try{
.
.
some code
.
}
catch(Exception ex)
{
throw ex;
}
答案 0 :(得分:15)
不,这是错误的。
只抓回去是没有意义的。
错误地重新抛出,导致丢失堆栈跟踪。重新抛出的正确方法(当重新抛出是有道理的时候),只是:throw;
如果要捕获一个异常然后再抛出另一个异常,则应将第一个异常保留为第二个异常。这是通过将其传递给构造函数来完成的。
底线:只捕捉您知道如何处理的例外情况。
答案 1 :(得分:5)
如果您在捕获之后立即抛出异常 - 这与完全没有try / catch块的情况基本相同。
捕获可能发生的特定异常。
例如,您尝试保存文件但由于某种原因无法写入:
try
{
SaveFile();
}
catch(FileIsReadOnlyException)
{
//do whatever to recover
}
catch(Exception ex)
{
//If we hit the generic exception, we're saying that we basically have
//no idea what went wrong, other than the save failed.
//
//Depending on the situation you might want to sink and log it, i.e. do nothing
//but log it so you can debug and figure out what specific exception handler to
//add to your code -- or you might want to try to save to a temporary file and
//exit the program.
//
//If you were UpdatingAnAdvertisement() or doing something else non-critical
//to the functioning of the program, you might just let it continue and
//do nothing.
//
//In that case, you can just omit the generic catch.
}
答案 2 :(得分:4)
在我看来,您通常应该尝试捕获您希望从try块中调用的代码中获得的异常,并让其余的异常被捕获。例如:
try
{
// ... some code that you know may throw ArgumentException or any other known exceptions
}
catch (ArgumentException ex)
{
// ... handle the exception with a good idea of why it was thrown
}
在catch块中,您现在可以以干净,特定的方式处理错误,因为知道try块中的某个地方传递了无效的参数。例如,您可以提醒用户他们提供了无效参数。
如果发生了一些您没想到的事情(例如NullReferenceException),您可能不知道如何从中恢复,所以通过不捕获它,您将责任委派给组件的使用者来处理一般的异常情况。
简而言之,当您知道如何处理或更正错误时,您应该捕获异常,并允许未知错误被捕获到调用链的更高位置
有意义吗?
答案 3 :(得分:2)
首先要抓住大多数特定的例外情况。
try
{
// some file system code
}
catch (DirectoryNotFoundException e1)
{
// do something about it
}
catch (IOException e2)
{
// do something else about it
}
catch (Exception e)
{
// most generic catch - probably just dump onto screen or error log
}
重新调整是为了更容易调试 - 这不是告诉用户错误的方法。正确的方法:
try
{
// some code that does X
}
catch (Exception e)
{
throw new Exception("describe X and parameters to it where applicable", e);
}
答案 4 :(得分:1)
并不是说它不正确,因为重新抛出异常不是你应该做的。重新抛出它的原因有很多,其中包括可维护性,性能和良好的编码实践等。不幸的是,编译器允许它。
至于何时应该捕获异常,一个好的经验法则是需要在您希望代码处理异常的时候捕获异常。