这个异常处理代码是否有效

时间:2010-09-07 15:11:44

标签: c# exception-handling

两个捕获块都会被击中吗?

try
{
    DoSomething();
}
catch (AuthenticationException e)
{
    throw;
}
catch (Exception e)
{
    throw new AuthenticationException("Hello ");
}

8 个答案:

答案 0 :(得分:8)

它是有效的(因为它将编译,构建和运行),但这不是一个好习惯。

仅捕获常规异常以重新抛出特定异常将导致问题。如果没有别的你正在破坏原来的异常调用堆栈。

为了响应您的编辑,两个catch块都不会被命中。

如果引发AuthenticationException,则将执行第一个块,对于任何其他异常,将执行第二个块。

答案 1 :(得分:3)

只会遇到一个例外块。它们按顺序排列,因此如果DoSomething()抛出AuthenticationException,则第一个catch块将运行。

那就是说,如果你所做的只是重新抛出异常,我可能根本不会在这里使用try / catches。这不是一个好习惯。至少,请确保在第二个catch中添加原始异常,作为您正在创建的AuthenticationException的InnerException:

catch(Exception e) 
{
    throw new AuthenticationException(e.Message, e);
}

答案 2 :(得分:2)

如果DoSomething抛出任何内容,此代码将抛出AutheniticationException。如果DoSomething抛出AuthenticationException,或者在任何其他情况下出现新异常,则会出现相同的异常。

附注 - 这不是很好的做法:

  1. 您丢失了一个非AuthenticationException
  2. 的异常的所有细节
  3. 如果基础代码认为存在其他错误,为什么要在此处抛出AuthenticationException?给我一个代码味道。

答案 3 :(得分:0)

如果您有不同类型的例外情况。 (2例外)

如果您希望第一个块将在第二个块到达。 (1个例外)

答案 4 :(得分:0)

没有。两个捕获块都不会被击中。

如果DoSomething抛出AuthenticationException,那么它将被捕获并重新抛出。

如果DoSomething抛出任何其他异常,将抛出一个新的AuthenticationException,并显示消息“Hello”。

答案 5 :(得分:0)

如果DoSomething()抛出AuthenticationException,那么

catch (AuthenticationException e)

将被使用。对于所有其他类型的例外,

catch (Exception e)

但是你不应该在第二个catch中抛出一个新的AuthenticationException。

答案 6 :(得分:0)

第二个块不会捕获第一个块的重新抛出异常。

答案 7 :(得分:0)

我可以看到捕获和重新抛出异常的一个好处是传达消息“请求的操作没有成功,但系统状态基本上与尝试操作之前一样。”虽然捕获内部例程中的所有异常并希望它们都没有代表应该导致主程序终止的问题,但是有点icky,我不确定哪种替代设计更好。人们可能会乱丢代码:

  If Not Integer.TryParse(inputString, inputVar) Then
    Throw New MyApp.FileLoadException("Whatever")
  EndIf

但是使用Integer.Parse并捕获发生的任何异常似乎更自然。在一个知道其预期原因的小域内捕获和重述一般例外远不如在更高层次吞下一般例外那么邪恶。