我是学习CSharp。我对处理异常有一些疑问。请指导我改进我的 编码知识。
假设我构建了一个代码段:
try {
SomeWork();
return success;
}
catch (someException ex)
{
throw new ExceptionDetails(ex);
return failure;
}
catch(AnotherException exp)
{
throw new ExceptionDetails(exp);
return failure;
}
finally
{
CleanUpStuff();
}
问题:
(1)我可以在“throw”(抛出异常)之后使用return语句吗?
(2)抛出异常丑陋的做法?。我究竟需要抛出异常吗?我是否需要使用“throw”来报告自定义异常?
(3)
try
{
SomeWork();
}
catch(StringIndexOutOfBound ex)
{
throw;
}
在catch中使用匿名throw语句是一个好习惯吗?
答案 0 :(得分:3)
提示:抛出后的任何内容都不会被执行。编译器应该告诉你!
答案 1 :(得分:3)
1)抛出的异常(如果没有处理)将自动返回到前一个方法,因此不需要返回。实际上,编译器应警告您存在无法访问的代码。
2)只要你在特殊情况下这样做,抛出异常并不难看。您的编码应该足够防御,以至于您不依赖于正常程序流的异常。
3)如果你不打算做任何其他事情,不要做#3。如果您要记录它或做一些有意义的事情并且仍想重新抛出异常,那么就像在那里一样“匿名”(??)使用它。
答案 2 :(得分:1)
如果您抛出异常,您的退货声明将无效。
尝试捕获特定的异常并从那里处理它,并在finally块之后返回值。
抛出前
会将堆栈跟踪重置为throw。
掷
将保持原始堆栈,这在调试时会很有用。
答案 3 :(得分:1)
关于differences between throw and throw ex的3阅读。正如Daniel所说,编译器会告诉你无法访问的代码。
答案 4 :(得分:1)
1)抛出异常后返回语句将无法编译,您应该收到无法访问的代码警告。
2)抛出异常是完全有效的,这可能允许发生一些更通用的错误处理。 e.g。
public void readFile()
{
try
{
// Perform IO action
}
catch ( FileNotFoundException ex )
{
// Perform error recovery e.g. create a default file
}
catch ( Exception ex )
{
// Cant perform any error recovery at this level so throw the exception to allow the calling code to deal with it
throw;
}
}
您可以在此争辩说,您应该在执行IO操作之前测试文件是否存在。根据经验,如果您可以使用if语句测试某些内容,那么您应该这样做。当您知道可以在生成它们的范围内从中恢复时,通常可以捕获特定的异常。
这类问题实际上取决于情况,因为在执行行动之前进行测试可能是更好的行动方案。您将对练习所需的内容有更多的了解!
3)正如帖子中其他地方已经提到的,通常不要只是“抛出”异常,因为有关它的发生方式和位置的信息在调试中通常非常有用。