捕捉异常一般的疑虑

时间:2009-10-07 07:08:38

标签: c# exception-handling

我是学习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语句是一个好习惯吗?

5 个答案:

答案 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)正如帖子中其他地方已经提到的,通常不要只是“抛出”异常,因为有关它的发生方式和位置的信息在调试中通常非常有用。