【问题标题】:Try/Catch Block Fails to Catch ExceptionTry/Catch 块无法捕获异常
【发布时间】:2015-01-29 23:00:08
【问题描述】:

我的程序在 try/catch 块中生成 System.ComponentModel.Win32Exception,但未捕获该异常。代码很简单:

try
{
    lAFE.MinimumSize = sz1;  // lAFE=Label, sz1 = Size
}
catch (Exception ex)
{
    MessageBox.Show("afe: " + ex.Message);
}

程序运行这个代码块数百次都没有问题,然后突然产生这个异常并且没有被捕获。

什么会导致这样的异常未被捕获。

此应用程序使用大量内存,当内存使用量达到约 305KB 时总是发生异常。

任何建议将不胜感激。

【问题讨论】:

  • 有什么异常?
  • 删除Exception ex 部分。仅对原生异常执行 catch { your stuff }
  • 出于好奇-您是否尝试捕获特定异常,在本例中为 Win32Exception ?如果可能的话,尽量远离一个空的 catch 块,因为这是不好的做法让战争开始。由于性能和糟糕的编码设计以及无法捕获特定异常并对其采取行动而导致不好。
  • 性能不会因为他有一个空的catch块而改变。在实际抛出异常之前,性能甚至不会受到影响。

标签: c# exception


【解决方案1】:

因为 Win32 异常不是从 .NET Exception 类派生的。试试看:

try 
{
} 
catch (Exception ex) 
{
    // .NET exception
} 
catch 
{
    // native exception
}

你可以阅读这个article:

处理异常的 catch 块捕获所有公共语言 符合规范 (CLS) 的异常。然而,它并没有抓住 不符合 CLS 的异常。不符合 CLS 的异常可以是 从本机代码或由 Microsoft 中间语言 (MSIL) 汇编程序。请注意,C# 和 Visual Basic 编译器不允许不符合 CLS 的异常 被抛出并且 Visual Basic 不捕获不符合 CLS 的 例外。如果 catch 块的目的是处理所有 异常,请使用以下通用 catch 块语法。

C#:捕捉 {}

【讨论】:

  • 我不确定这是否能解决问题,操作人员明确表示他正在获得System.ComponentModel.Win32Exception
  • 当我尝试你上面的建议时,编译器抱怨第二个 catch 指出前面的 catch 已经捕获了所有异常。
  • 这不可能是答案。
【解决方案2】:

这段代码是否在另一个线程/任务/异步方法中运行?

这里是一些“不能”被捕获的异常类型的示例。

UnmanagedFunctionPointer causes stackoverflow when using .NET 4.0, 3.5 works

在这种情况下,堆栈溢出异常会使异常处理崩溃,因此虽然它可能在某些情况下被捕获,但在上面它不是。

您能否发布更多有关如何调用此方法的上下文?我会更新这个答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-07
    • 2014-03-22
    相关资源
    最近更新 更多