问题标签 [exception]

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 投票
8 回答
13030 浏览

java - 在 Java 中创建异常的一般经验法则是什么?

我遇到过两种情况:

  • 创建太多自定义异常
  • 使用过多的通用异常类

在这两种情况下,项目都开始正常,但很快就成为维护(和重构)的开销。

那么关于创建自己的异常类的最佳实践是什么?

0 投票
18 回答
62758 浏览

java - 何时选择已检查和未检查的异常

在 Java(或任何其他具有检查异常的语言)中,当创建自己的异常类时,您如何决定是否应该检查或不检查?

我的直觉是,在调用者可能能够以某种有效的方式恢复的情况下,会调用检查异常,而对于不可恢复的情况,未经检查的异常会更多,但我会对其他人的想法感兴趣。

0 投票
3 回答
2799 浏览

c++ - C++异常分析工具

我一直在寻找一种从 C++ 程序中提取异常信息的工具。我正在寻找的最想要的功能:我想知道可以从函数中抛出的所有异常(这将包括从该函数递归调用的所有函数)。

我一直认为记录错误和异常特别是非常困难的(并且需要付出很多努力才能保持最新状态)。但如果有某种方法可以自动化,那将非常有帮助。

Windows 和 Visual Studio 的工具将是首选但不是必需的,我总是可以解决这个问题。

0 投票
1 回答
690 浏览

c# - Why do my exception stack traces always point to the last method line?

I have a problem with my Visual Studio installation. When I got an exception I always have incorrect line numbers in it's stack trace. There are always point to last line of each method in my codebase. At the same time it's OK when I'm tracing programs with debugger. What's happed with PDBs?

No, I'm not re-throwing exception at each method.

In each line of stack trace I have last row of corresponding method, while exception had thrown by statement in the middle.

0 投票
3 回答
12743 浏览

.net - 如何从 ASP.NET 中的肥皂异常中提取内部异常?

我有一个像这样的简单 Web 服务操作:

然后我有一个使用 Web 服务然后调用操作的客户端应用程序。显然它会抛出一个异常:-)

在我的捕获块中,我想做的是提取实际异常的消息以在我的代码中使用它。捕获的异常是 a SoapException,这很好,但它的Message属性是这样的......

...而且InnerExceptionnull

我想做的是提取(我的示例中的文本)的Message属性,有人可以帮忙吗?如果可以避免,请不要建议解析.InnerExceptionHelloWorldExceptionMessageSoapException

0 投票
9 回答
3007 浏览

c# - 如何从未经检查的异常中恢复?

如果您想以相同的方式处理每个故障,例如通过记录它并跳到下一个请求,向用户显示消息并处理下一个事件等,未经检查的异常是可以的。如果这是我的用例,我必须做的是在我的系统中捕获一些高级别的一般异常类型,并以相同的方式处理所有事情。

但我想从特定问题中恢复过来,我不确定用未经检查的异常处理它的最佳方法。这是一个具体的例子。

假设我有一个使用 Struts2 和 Hibernate 构建的 Web 应用程序。如果我的“动作”出现异常,我会记录下来,并向用户表示歉意。但是我的 Web 应用程序的功能之一是创建新的用户帐户,这需要一个唯一的用户名。如果用户选择了一个已经存在的名称,Hibernate 会org.hibernate.exception.ConstraintViolationException在我的系统内部抛出一个(未经检查的异常)。我真的很想通过要求用户选择另一个用户名来从这个特定问题中恢复过来,而不是给他们同样的“我们记录了你的问题,但现在你已经被淹没了”的消息。

这里有几点需要考虑:

  1. 有很多人同时创建帐户。我不想在“SELECT”之间锁定整个用户表以查看名称是否存在,如果不存在则“INSERT”。在关系数据库的情况下,可能有一些技巧可以解决这个问题,但我真正感兴趣的是由于基本竞争条件而无法预先检查异常的一般情况。同样的事情也适用于在文件系统上查找文件等。
  2. 考虑到我的 CTO 倾向于通过阅读“Inc.”中的技术专栏来进行偷渡式管理,我需要围绕持久性机制设置一层间接层,这样我就可以抛弃 Hibernate 并使用 Kodo 或其他任何东西,而不需要更改任何东西,除了最低的持久化代码层。事实上,在我的系统中有几个这样的抽象层。尽管有未经检查的异常,如何防止它们泄漏?
  3. 已检查异常的一个公认的弱点是必须在堆栈上的每次调用中“处理”它们——要么通过声明调用方法抛出它们,要么通过捕获它们并处理它们。处理它们通常意味着将它们包装在另一个适合抽象级别的类型的检查异常中。因此,例如,在检查异常领域,我的 UserRegistry 的基于文件系统的实现可能会 catch IOException,而数据库实现会 catch SQLException,但两者都会抛出UserNotFoundException隐藏底层实现的 a。如何利用未经检查的异常,在不泄露实现细节的情况下减轻每一层包装的负担?
0 投票
25 回答
67418 浏览

c# - 为什么 .NET 异常没有被 try/catch 块捕获?

我正在开发一个使用 C# 的ANTLR解析器库的项目。我已经建立了一个语法来解析一些文本,并且效果很好。但是,当解析器遇到非法或意外标记时,它会抛出许多异常之一。问题是在某些情况下(不是全部)我的 try/catch 块不会捕获它,而是作为未处理的异常停止执行。

对我来说,问题是除了在我的完整代码中之外,我无法在其他任何地方复制这个问题。调用堆栈显示异常肯定发生在我的 try/catch(Exception) 块中。我唯一能想到的是,在我的代码和引发异常的代码之间发生了一些 ANTLR 程序集调用,并且这个库没有启用调试,所以我无法单步执行。我想知道不可调试的程序集是否会抑制异常冒泡?调用堆栈如下所示;外部程序集调用在 Antlr.Runtime 中:

Parse() 中最底层调用的代码片段如下所示:

对我来说,一个 catch (Exception) 子句应该已经捕获了任何异常。有什么理由不这样做吗?

更新:我用 Reflector 追踪了外部组件,没有发现任何螺纹迹象。该程序集似乎只是 ANTLR 生成代码的运行时实用程序类。抛出的异常来自 TimeDefLexer.mTokens() 方法,其类型为 NoViableAltException,它派生自 RecognitionException -> Exception。当词法分析器无法理解流中的下一个标记时,将引发此异常;换句话说,无效输入。应该会发生此异常,但是它应该已被我的 try/catch 块捕获。

此外,重新抛出 ParserException 与这种情况确实无关。这是一个抽象层,它在解析期间接受任何异常并转换为我自己的 ParserException。我遇到的异常处理问题永远不会到达那行代码。事实上,我注释掉了“throw new ParserException”部分,仍然得到相同的结果。

还有一件事,我修改了原来的 try/catch 块,改为捕获 NoViableAltException,消除了任何继承混淆。我仍然收到相同的结果。

有人曾经建议,有时 VS 在调试模式下捕获处理的异常时过于活跃,但这个问题也发生在发布模式下。

伙计,我还是很难过!我之前没有提到它,但我正在运行 VS 2008,我所有的代码都是 3.5。外部程序集为 2.0。此外,我的一些代码子类化了 2.0 程序集中的一个类。版本不匹配会导致此问题吗?

更新 2:我能够通过将 .NET 3.5 代码的相关部分移植到 .NET 2.0 项目并复制相同的场景来消除 .NET 版本冲突。在 .NET 2.0 中持续运行时,我能够复制相同的未处理异常。

我了解到 ANTLR 最近发布了 3.1。所以,我从 3.0.1 升级并重试。事实证明,生成的代码进行了一些重构,但在我的测试用例中出现了相同的未处理异常。

更新 3: 我在一个简化的 VS 2008 项目中复制了这个场景。随意下载并亲自检查该项目。我已经应用了所有很棒的建议,但还没有能够克服这个障碍。

如果您能找到解决方法,请分享您的发现。再次感谢!


谢谢,但是 VS 2008 会自动中断未处理的异常。另外,我没有 Debug->Exceptions 对话框。抛出的 NoViableAltException 完全是有意的,并且被设计为被用户代码捕获。由于未按预期捕获,因此程序执行会作为未处理的异常意外停止。

抛出的异常是从 Exception 派生的,并且 ANTLR 没有进行多线程。

0 投票
14 回答
5693 浏览

c++ - C++中的异常被捕获后找出源头?

我正在寻找 MS VC++ 中的答案。

在调试大型 C++ 应用程序时,不幸的是,它大量使用了 C++ 异常。有时我比我真正想要的晚一点才发现异常。

伪代码示例:

我可以在调试时用断点捕获异常。FunctionA()但是如果异常发生在orFunctionB()或其他函数中,我无法追溯。(假设广泛的异常使用和上述示例的巨大版本)。

我的问题的一种解决方案是确定调用堆栈并将其保存在异常构造函数中(即在它被捕获之前)。但这需要我从这个基异常类派生所有异常。它还需要大量代码,并且可能会减慢我的程序。

有没有更简单的方法需要更少的工作?无需更改我的大型代码库?

其他语言有没有更好的解决这个问题的方法?

0 投票
3 回答
3908 浏览

exception - 如何使用 .NET 2.0 在 using 块中捕获异常?

这些天,当我有一个实现 IDisposable 的对象时,我越来越多地尝试利用 using 块,但我还没有弄清楚的一件事是如何像在正常的 try/catch/finally 中那样捕获异常......任何代码示例可以为我指明正确的方向?

编辑:阅读回复后修改了问题。它是“如何使用 .NET 2.0 在 using 块中引发异常?” 但我实际上是在寻找一种在 using 块中捕获这些异常的方法。


我正在寻找更多关于在 using 块内滚动我自己的捕获块的详细信息。

编辑:我想避免的是必须在我的 using 块中使用 try/catch/finally,就像 @Blair 显示的那样。但也许这不是问题......

编辑:@Blair,这正是我想要的,感谢您的详细回复!

0 投票
6 回答
22880 浏览

c++ - 如何在不使用 abort() 的情况下断言()?

如果我使用assert()并且断言失败,那么assert()将调用abort(),突然结束正在运行的程序。在我的生产代码中我负担不起。有没有办法在运行时断言但能够捕获失败的断言,以便我有机会优雅地处理它们?