问题标签 [exception-handling]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
16281 浏览

wpf - WPF - DispatcherUnhandledException 似乎不起作用

我在 VS2008 中开始了一个新的 WPF 项目,然后在 trap 中添加了一些代码DispatcherUnhandledException。然后我添加了一个抛出异常,Window1 但错误没有被处理程序捕获。为什么?

0 投票
5 回答
2746 浏览

c# - 在 .net 中处理数据库异常

当我们可以捕获异常时: Violation of UNIQUE KEY constraint 'IX_Product'. Cannot insert duplicate key in object 'Product'. (2627).
挑战在于如何将索引名称 IX_Product 分解为成员(即我不想将消息子串化)。一个表上可能有多个唯一约束,我们需要知道哪一个可以向用户提供更详细的信息。最好将它作为 DbException 捕获,因此它不是特定于 SQL Server 的。有没有办法从异常中获取受影响的索引而不必解析字符串?

我想出但我没有测试过的唯一解决方案是使用存储过程并在其中捕获错误并从存储过程返回更详细的消息。但我相信这仍然会有问题。

0 投票
8 回答
3343 浏览

database - 我应该检查代码中的 DB 约束还是应该捕获 DB 抛出的异常

我有一个将数据保存到名为 Jobs 的表中的应用程序。Jobs 表有一个名为 Name 的列,它有一个 UNIQUE 约束。Name 列不是 PRIMARY KEY。我想知道在尝试保存/更新新条目之前是否应该自己检查重复条目,或者是否最好等待数据访问层抛出异常。如果它很重要,我正在为这个应用程序使用 NHibernate


感谢大家的大力投入。

我找到了另一个原因,为什么我应该在代码中进行验证,而不仅仅是等待抛出异常(并被我的代码捕获)。似乎 NHibernate 只会抛出一个 NHibernate.Exceptions.GenericADOException ,这对于这种情况下异常的原因并不是很丰富。还是我在这里错过了 NHibernate 的一个方面?

0 投票
6 回答
4729 浏览

.net - Microsoft 异常处理块 - 这不是过度工程的完美示例吗?

自从 Microsoft 推出应用程序块以来,我一直在遇到使用异常处理应用程序块的人。我最近仔细观察了自己,并将基本功能总结如下(如果您已经知道它的作用,请跳过以下块):

异常处理应用程序块旨在集中并使用配置文件完全可配置以下关键异常处理任务

  • 记录异常
  • 替换异常
  • 包装异常
  • 传播异常
  • 等等

该库通过让您修改 try catch 块来做到这一点,如下所示:

根据 app.config 中为策略名称指定的内容(请参阅此处的文档),HandleException 将...

  • 抛出一个全新的异常(替换原来的异常)
  • 将原始异常包装在一个新异常中并抛出该异常
  • 吞下异常(即什么都不做)
  • 你有没有重新抛出原来的异常

此外,您还可以预先对其进行配置以执行更多操作(例如记录异常)。

现在这是我的问题:我完全看不出无论是替换、包装、吞下还是重新抛出异常,使其可配置有什么好处。根据我的经验,这个决定必须在您编写代码时做出,因为当您更改异常处理行为时,您通常必须更改周围或调用代码。

例如,当您重新配置时,您的代码可能会开始出现不正确的行为,使得在特定点抛出的特定异常现在被吞没而不是重新抛出(catch 块之后可能有代码在发生异常时不得执行)。异常处理中所有其他可能的更改也是如此(例如,替换 -> 重新抛出,吞下 -> 包装)。

所以,对我来说,最重要的是异常处理块解决了实际上不存在的问题。异常记录和通知位很好,但不是所有其他的东西只是过度工程的完美例子吗?

0 投票
5 回答
1993 浏览

python - 捕获 MainLoop 异常并在 MessageDialogs 中显示它们

我有一个依赖于外部配置文件的 wxPython 应用程序。如果有任何配置错误,我想提供友好的消息对话框。我试图通过将我的 app.MainLoop() 调用包装在 try/except 语句中来完成这项工作。

下面的代码适用于我的 MainWindow 框架类中的初始化代码,但不会捕获 MainLoop 中发生的任何异常。我怎样才能捕捉到这些异常呢?

我读过一些关于可以在 wx.App 类中覆盖的 OnExceptionInMainLoop 方法的提及,但是我读到的源代码必须是过时的(2004 年),因为 wx.App 似乎不再具有该名称的方法。

编辑:

我需要能够在我的主循环期间捕获未处理的异常,以便我可以进一步处理它们并将它们显示在错误对话框中,而不是静默传递,也不会终止应用程序。

sys.excepthook 解决方案级别太低,与 wxPython 主循环线程不兼容。虽然指向另一个答案的链接执行相同的尝试/除了环绕主循环,但由于 wxPython 再次为应用程序 / ui 生成不同的线程而无法正常工作。

0 投票
27 回答
68687 浏览

.net - 为什么存在 NotImplementedException?

这真的,真的让我很生气,所以我希望有人能给我一个合理的理由来解释为什么事情是这样的。

未实现异常。 你在拉我的腿,对吧?

不,我不会轻描淡写地说:“等一下,该方法已实现 - 它会抛出 NotImplementedException。” 是的,没错,您必须实现抛出 NotImplementedException 的方法(与 C++ 中的纯虚函数调用不同——现在这很有意义!)。虽然这非常有趣,但我的脑海里还有一个更严重的问题。

我只是想知道,在存在 NotImplementedException 的情况下,任何人都可以用 .Net 做任何事情吗?您是否希望使用 try catch 块包装每个抽象方法调用以防止可能未实现的方法?如果你捕捉到这样的异常,你到底应该用它做什么?

我看不到在不调用方法的情况下测试方法是否实际实现的方法。由于调用它可能会产生副作用,因此我无法预先进行所有检查然后运行我的算法。我必须运行我的算法,捕捉 NotImplementedExceptions 和一些如何将我的应用程序回滚到某个理智状态。

这很疯狂。疯狂的。疯狂的。所以问题是: 为什么 NotImplementedException 存在

作为先发制人,我不希望任何人回应,“因为设计师需要将其放入自动生成的代码中。” 这太可怕了。我宁愿在您提供实现之前不编译自动生成的代码。例如,自动生成的实现可以是“throw NotImplementedException;” NotImplementedException 未定义的地方!

有没有人捕获并处理过 NotImplementedException?你有没有在你的代码中留下 NotImplementedException ?如果是这样,这是否代表了一个定时炸弹(即,您不小心把它留在了那里),还是一个设计缺陷(该方法不应该被实现并且永远不会被调用)?

我也很怀疑 NotSupportedException ......不支持?什么?如果不支持,为什么它是您界面的一部分?Microsoft 的任何人都可以拼写不正确的继承吗?但是,如果我没有为此受到太多滥用,我可能会为此提出另一个问题。

附加信息:

是有关该主题的有趣读物。

似乎与Brad Abrams达成了强烈的共识,即“NotImplementedException 适用于尚未实现但确实应该(并且将会)实现的功能。就像您在构建类时可能会开始的那样,获取所有方法那里抛出 NotImplementedException,然后用真正的代码将它们清除掉……”

Jared Parsons的评论很弱,可能应该被忽略: NotImplementedException:当一个类型由于任何其他原因没有实现方法时抛出这个异常。

MSDN在这个主题上甚至更弱,只是声明“当请求的方法或操作未实现时引发的异常”。

0 投票
3 回答
1037 浏览

exception - 何时对域类中的异常使用断言

在任何情况下,您会在域类中使用断言而不是异常处理...

0 投票
9 回答
551 浏览

exception - 哪种合同(按合同设计)更好?

假设我有一个方法

返回给定 id 的 Patient 对象。我可以通过 2 种方式定义合同

  1. 如果患者不存在,方法将返回 null
  2. 如果患者不存在,方法将抛出异常。在这种情况下,我还将定义一个查询方法,如果患者存在于数据库中则返回 true,否则返回 false...

我应该使用哪个合约?还有其他建议吗?

更新:请也对此案例发表评论...如果它不是数据库分配的 Id 并且它是用户在 UI 中输入的内容 .. 像 SSN .. 那么哪个更好..

我认为来自 Steve 的关于 Null 模式的评论是有效的:这里可能不是一个好主意,因为当 ID 不存在时立即知道会非常有用。

而且我也认为这里的 Null 模式会有点重

Rob Wells 关于抛出异常的评论,因为它的 ID 错误:我不认为患者姓名中的拼写错误是一种特殊情况”恕我直言

0 投票
2 回答
1545 浏览

c# - Break at throw 捕获的异常

0 投票
5 回答
82872 浏览

c# - 在 try { return x; 中真正发生了什么?} 最后 { x = null; } 陈述?

我在另一个问题中看到了这个提示,想知道是否有人可以向我解释这到底是如何工作的?

我的意思是,finally子句真的在语句之后执行吗?return这段代码有多线程不安全?你能想到任何其他可以通过这个try-finallyhack 完成的黑客行为吗?