为什么不捕获一般异常

2023-12-01

我的VS刚刚告诉我;

警告 2 CA1031:Microsoft.Design:修改“Program.Main(string[])”以捕获比“Exception”更具体的异常或重新引发异常。

我为什么要那么做?如果我这样做,并且没有捕获所有异常来处理它们,我的程序就会崩溃并显示所有流行的报告屏幕。我不希望我的用户遇到这样的错误!

为什么我不应该立即捕获所有异常,向用户显示一个很好的警告:“出了问题,不用关心,我会处理它,请耐心等待”?

Edit: 刚看到这里有一个骗子,抱歉Dupe

Edit2:澄清事情;在捕获任何异常后,我确实退出程序!我只是不希望我的用户看到在控制台应用程序中引发未处理的异常时出现的“向微软报告”对话框!


吞并异常是一种危险的做法,因为:

  • 它可能会导致用户认为某件事成功了,而实际上却失败了。
  • 它可能会将您的应用程序置于您未计划的状态。
  • 它使调试变得复杂,因为当您处理奇怪/损坏的行为而不是堆栈跟踪时,很难找出故障发生的位置。

正如您可能想象的那样,其中一些结果可能是极其灾难性的,所以正确地做到这一点是一个重要的习惯。

最佳实践

首先,进行防御性编码,以便不会发生不必要的异常。它们的计算成本很高。

精细地处理预期的异常(例如:FileNotFoundException) 如果可能。

对于意外异常,您可以执行以下两种操作之一:

  • 让它们正常冒泡并导致崩溃
  • 抓住他们并优雅地失败

优雅地失败?

假设您正在 ASP.Net 中工作,并且您不想向用户显示死机黄屏,但您也不希望向开发团队隐藏问题。

在我们的应用程序中,我们通常会捕获未处理的异常global.asax然后进行日志记录并发送通知电子邮件。我们还展示了一个更友好的错误页面,可以在web.config使用customErrors tag.

这是我们的最后一道防线,如果我们最终收到电子邮件,我们会立即采取行动。

这种类型的模式是not与吞咽异常相同,其中有一个空的 Catch 块,它的存在只是为了“假装”异常没有发生。

其他注意事项

在 VS2010 中,出现了一种称为 intellitrace 的功能,它允许您通过电子邮件将应用程序状态实际发送回家并单步执行代码、检查异常时的变量值,等等。这将非常有用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么不捕获一般异常 的相关文章

  • 在Python中处理未声明的字典键

    在我的 Ruby 应用程序中 我有一个哈希表 c sample gt 1 another gt 2 我可以这样处理桌子 c sample nil c another nil c not in list nil 我正在尝试用 Python 做
  • Windows 窗体未处理异常对话框

    每当我的 C 应用程序遇到 U E 时 我希望获得默认 Windows 窗体未处理异常对话框 在 vs 2005 中 当我关闭 app conf 中的 jit 调试时 如下所示
  • 实体框架中的重复键异常?

    我试图捕获当我将具有给定用户名的现有用户插入数据库时 引发的异常 正如标题所说 我正在使用 EF 当我尝试将用户插入数据库时 引发的唯一异常是 UpdateException 如何提取此异常以识别其是否是重复异常或其他异常 catch Up
  • yii2:抛出新异常的正确方法

    只是为了测试 我在模型中添加了这段代码 同时设置 debug true 和 false if packagedays lt 1 throw new yii base Exception package days cannot be less
  • System.Drawing.Icon 构造函数抛出“操作成功完成”异常

    在 Windows XP 计算机上 以下代码抛出 System ComponentModel Win32Exception 并显示消息 操作成功完成 System Drawing Icon icon new System Drawing I
  • java字符串索引越界异常

    从类中调用函数时出现以下错误 java lang StringIndexOutOfBoundsException 字符串索引超出范围 1 尽管我使用系统打印来查看我在 substring 函数中传递的输入 但一切似乎都是正确的 函数 isC
  • “引发异常()”和“引发异常”(不带括号)之间有区别吗?

    定义无参数异常 class MyException Exception pass 当提出时 以下之间有什么区别 raise MyException and raise MyException 我找不到任何 它只是一个重载语法吗 简短的回答是
  • C++ 中的错误分配异常

    在我的一个学校项目中 我被要求创建一个程序而不使用STL 在程序中我使用了很多 Pointer new Something if Pointer NULL throw AllocationError 我的问题是关于分配错误 有没有一个自动例
  • 在新表达式中分配内存后是否评估初始化程序?

    考虑代码 auto p new T U std move v 那么初始化器就是U std move v 我们假设T U std move v 不抛出 如果在底层内存分配之后评估初始化程序 则代码是强异常安全的 否则 就不是 内存分配被抛出
  • 间歇性 SQLiteException:dbopen 上不是错误

    在我的应用程序中 我在很多情况下使用数据库 但有一种情况我遇到异常 但不是每次都出现异常 并且可以重现它 还 这种情况仅发生在操作系统版本 2 3 7 和 2 1 update 1 上 代码 public void removeOldOcc
  • 包含多列查询

    当任一列可能为空时 如何使用 LINQ to SQL 搜索多个列 IEnumerable
  • 使用Android WebView时JavaScript异常在哪里显示?

    我有一个简单的 HTML 我将其加载到 Android WebView SDK 版本 1 5 中 h1 Hello World h1 函数 nomethod 不存在 但 LogCat 不显示任何错误 似乎任何未捕获的异常都无法追踪 知道如何
  • django order_by FieldError异常无法被捕获

    from django core exceptions import FieldError This is a method of a class def order item list self item list order items
  • 如何使用 Python 正确传播错误消息

    我对正确的 Python 错误处理有点陌生 并且我很难找到处理多种方法链中的错误的最佳方法 我有3种方法 a b c a正在打电话b and b正在打电话c 如何从方法中传播错误c回到方法a所以我可以例如将其存储在某处或在 API 响应期间
  • Pandas .apply() 函数中的异常处理

    如果我有一个数据框 myDF DataFrame data 11 11 22 2A 33 33 columns A B 给出以下数据帧 从 stackoverflow 开始 对于数据帧的图像没有足够的声誉 A B 0 11 11 1 22
  • Haskell 错误处理方法

    毫无疑问 Haskell 中有多种机制来处理错误并正确处理它们 错误单子 要么 也许 异常等 那么为什么用其他语言编写容易出现异常的代码比用 Haskell 感觉更简单呢 假设我想编写一个命令行工具来处理命令行上传递的文件 我想 验证提供的
  • WCF 的“using”语句中出现异常,未正确关闭连接。如何关闭有故障的 WCF 客户端连接或出现异常的连接?

    StackOverflow 上有几个有关关闭 WCF 连接的问题 但排名最高的答案是指此博客 http marcgravell blogspot com 2008 11 dontdontuse using html http marcgra
  • 为什么 exceptT 没有 MonadMask 实例?

    爱德华 克梅特例外情况图书馆不提供单子掩码 https www stackage org haddock lts 7 18 exceptions 0 8 3 Control Monad Catch html t MonadMask实例为Ex
  • 分层架构中的异常处理

    我们正在分层设计中重构 当然还有重新设计 我们的服务 我们有服务操作层 BLL 网络抽象层 gt 处理网络代理 数据抽象层 但我们对我们的异常处理策略有点困惑 我们不想向外界透露太多 BLL 的信息 从其他层到bll就可以了 我们不想让 t
  • 如何知道抛出了哪个异常

    我正在对我们的代码库进行审查 有很多这样的陈述 try doSomething catch Exception e 但我想要一种方法来知道 doSomething 抛出了哪个异常 在 doSomething 的实现中没有 throw 语句

随机推荐