何时以及为什么我应该明确地抛出异常

时间:2011-07-06 19:21:44

标签: c# exception

我只是想让我对异常机制的理解更清楚 如果在执行应用程序时出现问题,运行时会自动抛出相应的异常。如果是这样,那么为什么我有时应该进行一些检查并明确抛出一个特定的例外?
如何识别这种情况(当代码中应明确抛出异常时)?

我没有故意在这里提出任何例子,因为我想对投掷例外方法有一个大致的了解。

6 个答案:

答案 0 :(得分:6)

我认为一般方法应该是Fail Fast - 您希望尽快识别和处理无效的程序条件,这不仅意味着您的程序逻辑中需要特定输入,而且只要您“接收”此输入(可能在时间和/或代码行中更早)。

对于公共方法,即首先验证输入,如果输入违反了方法所期望的,则抛出异常。

答案 1 :(得分:3)

通常,我的规则是,如果发生错误,我正在编写的代码无法专门处理,我将抛出异常。例如,如果我正在编写一个接受几个参数的函数,并且如果参数为null,则函数没有意义,我将检查它并抛出一些ArgumentNullException

答案 2 :(得分:3)

通常,方法,子例程,组件,服务或系统只有在无法完成(成功完成)任何要求的事情时才会抛出异常。

当然,“不管它被要求做什么”在某种程度上都是主观的。例如,如果在实用程序库中有一个名为SaveFile()的方法,并且无法保存该文件,但是您从尝试将文件保存到可能存在或可能存在的位置的客户端调用该文件,并且客户端应用程序甚至不关心文件是否被保存...然后实用程序库SaveFile()方法仍然应该抛出异常,并且客户端应该在它被调用的地方吞下它。

答案 3 :(得分:2)

我不知道我可以表达详尽的清单,但一些好的例子可能包括

  1. 当您需要停止/改变时 执行一个场景 不会导致任何系统异常 (如果没有带有n条的foos 系统有问题,抛出一个 自定义例外)

  2. 当你在一个边界时     系统异常包括数据     这不是必需的,也可能不是     希望揭露(用户我没有     需要查看堆栈中的所有内容     跟踪,但您可以记录实际异常然后抛出自定义     异常(数据访问,服务访问,     等),让你控制什么     传播到下游。

  3. 何时可以添加其他内容     上下文信息     例外,即你抓到了一些     异常并可以将其用作     新异常的内部异常     包括可以的信息     对记录/调试等有用。

答案 4 :(得分:2)

每当应用程序进入任何异常状态时,您都可以抛出异常。可能存在违反的不变量(“x永远不能为空!”是一个好的不变量,可能被断言或异常覆盖)。也许有些事情非常糟糕,例如:另一台机器发送了损坏的数据。当然,一切都会导致您选择的运行时(java,.net)出现异常或错误,但每当您的自定义异常更简洁时(更接近导致问题的代码行,更好的命名,...... )而不是内置的,它可能是自定义异常的候选者。

自定义异常的另一个原因:如果所有异常都从自定义异常类继承,则客户端更容易捕获他感兴趣的异常。大多数情况下,没有人想要捕获NPE或类似的东西,因此,捕捉较小范围的例外情况可能更方便。

答案 5 :(得分:0)

每个方法都有一个返回类型(无论该类型是void,int,string,car等),异常允许您将消息返回给非类型为T的调用上下文,但是类型为Exception,说“出了问题”。出了什么问题是通过派生类型(来自异常,作为SQLException)和消息来识别。这为消息传递错误创建了一个统一的接口(按类型例外)。