c# - 程序不应尝试从哪些异常中恢复?

标签 c# .net vb.net

异常会对程序产生不同程度的影响。例如,如果引发 OutOfMemoryException,程序可能应该中止,但可以安全且适本地处理 System.Data.SqlClient.SqlException,而不会将程序置于未知状态.

我确实明白,如果处理不当,任何异常都有可能使程序处于不稳定状态。除了简单地记录和抛出堆栈之外,是否存在永远不应该处理的异常?

最佳答案

这是一个个案理论问题,所以答案将是理论性的。我听过的最好的答案是,“如果您不知道如何处理异常,请不要处理它。”记录消息并抛出异常向上堆栈很好,因为您实际上已经完成了某事(即使它只是表明发生了错误)。但是,捕获错误而不是将其扔到堆栈中可能会导致隐藏的错误和困难的调试 session 。

我们一直在做的是实现一个顶级错误处理程序,它将执行一般错误处理(如记录消息、提醒开发人员等)。代码中未处理的所有异常都至少由顶级处理程序处理。 可以在代码中较低位置处理的异常肯定会在它们发生的地方处理。

考虑在电子邮件地址列表上循环以将消息发送到邮件列表的情况。如果其中一个电子邮件地址格式不正确,可能会发生异常,但我们不希望单个电子邮件地址导致其余处理失败。通过处理发生的特定异常类型,我们可以记录它(甚至将电子邮件地址标记为无效)并继续处理列表的其余部分。

底线:您是否处理给定的异常类型实际上取决于您的代码是否知道在发生异常类型时如何恢复。

关于c# - 程序不应尝试从哪些异常中恢复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9689853/

相关文章:

arrays - 在 SSRS 的文本框中显示字符串列表

vb.net - 在 Visual Basic .NET 中分配特定数量的物理内存?

c# - MVC和MVVM框架的ViewModel部分位于哪一层?

c# - 如何使用 Moq 从 Repository 中正确伪造 IQueryable<T>?

c# - 如何使用 ASP.NET MVC 中的 Entity Framework 将记录插入到具有外键的表中

.NET 工厂模式

asp.net - Web 服务在 SOAPAction 中添加额外的正斜杠

c# - 将 EF 查询限制为具有 TPT 继承的基类型

c# - WCF 和 SOAP header - 如何确保默认 header 元素未在请求中签名?

c# - 更改用于 XML 序列化的 XmlElement 名称