【问题标题】:How can code in a "try...catch" block throw an unhandled exception?“try...catch”块中的代码如何引发未处理的异常?
【发布时间】:2009-11-17 16:06:32
【问题描述】:

我今天在某些代码中遇到了异常:“A [some exception] is unhandled.”

但是,这段代码显然在“try/catch”结构的“try”块内。

我在这里错过了什么?

更新:它是 C#

更新:哦,算了。事实证明,错误的具体机制是我是个白痴。没有办法解决这个问题。

【问题讨论】:

  • 你使用什么语言/框架?
  • 如果您发布代码,可能更容易诊断您的问题
  • 需要更多信息。尝试发布一些 ocde。
  • 在 C++ 中,如果您不启用 SEH(结构化异常处理),则不会在 catch 块中捕获低级别、特定于操作系统的事件,例如算术异常。
  • 虽然很尴尬,但您想补充一些关于您所做的假设或您误解了什么概念的细节吗?至少这样,在同一问题上苦苦挣扎的人可能有机会找到解决方案。

标签: c# error-handling


【解决方案1】:

catch 语句是否指定了特定类型的异常?

如果是,它只会捕获该类型的异常。

【讨论】:

  • 我发现“异常”。不都是从那个派生出来的吗?
  • 不一定,尽量不要在 catch 块中指定任何内容。
【解决方案2】:

您是否在打开了“异常中断”/“抛出中断”的调试器中运行?在这种情况下,您会在将异常传递给 try/catch 之前看到异常。

【讨论】:

  • 这是在调试器中,是的。这可能是它。在 Visual Studio 中,这是某个地方的设置吗?
  • 当您遇到异常时,您能否继续,然后看到它进入 try/catch?异常设置通常在“Debug->Exceptions”下。根据语言的不同,您可以执行不同的操作。
【解决方案3】:

非托管异常不会被catch(Exception e)捕获,你可以试试

    try
    {
    }
    catch
    {
    }

而不是

        try
        {
        }
        catch (Exception e)
        {
        }

【讨论】:

    【解决方案4】:

    由递归引起的一些问题,例如 StackOverFlow 异常等,会在 try...catch 块内抛出,因为它们实际上不是从块内的任何特定代码行抛出的,而是由 CLR 抛出的。对于内存超出范围异常和其他不是任何一行代码的直接结果的问题也是如此。

    也许你在谈论这样的事情:

    【讨论】:

      【解决方案5】:

      我有 10 美元说它是 ThreadAbortException 或其他一些自抛出异常。如果是这种情况,您必须两次捕获异常。

      【讨论】:

        【解决方案6】:

        不了解语言很难说,但许多语言都有无法捕获的异常的概念 - 例如在 .NET 中,无法捕获 OutOfMemoryException 和 ExecutionEngineException(以及其他),因为它们本质上是不可恢复的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-01-01
          • 2018-12-13
          • 1970-01-01
          • 2017-02-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多