【问题标题】:C# not catching exceptions in code, or with debuggerC# 未在代码中或使用调试器时捕获异常
【发布时间】:2025-12-20 18:45:11
【问题描述】:

我正在学习如何使用 Emgu,并且遇到了 VS2015 的问题,它没有打破它的异常,以及它的异常没有被 try/catch 块捕获。 Visual Studio 中的异常通知会闪烁一秒,然后程序退出。

我的代码:

using System;
using Emgu.CV;
using Emgu.CV.UI;
using Emgu.CV.Structure;
using Emgu.CV.Util;
using Emgu.CV.CvEnum;

namespace OpenCV1
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                using (var image = new Image<Bgr, byte>(@"C:\Users\Administrator\Downloads\receipt-1.jpg"))
                {
                    float scale = (float)500 / (float)image.Height;
                    var resized = image.Resize(scale, Emgu.CV.CvEnum.Inter.Nearest);
                    var grey = image.Convert<Gray, byte>();
                    grey = grey.SmoothGaussian(5, 5, 1, 1);
                    var edged = grey.Canny(25, 100);

                    //ImageViewer.Show(edged, "edged");

                    VectorOfVectorOfPointF contours = new VectorOfVectorOfPointF();
                    Mat hierarchy = null;
                    CvInvoke.FindContours(edged.Copy(), contours, hierarchy, RetrType.List, ChainApproxMethod.ChainApproxSimple);
                    Console.ReadLine();
                }
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.ReadLine();
            }
        }
    }
}

我的 VS2015 异常设置:

异常屏幕截图(在关闭之前闪烁速度太快,无法看到):

为什么我不能捕捉到这些异常,为什么 Visual Studio 不会中断它们?它仍然显示异常消息,但几乎立即关闭。

【问题讨论】:

  • 当我之前看到这种行为是因为调试器调用的非托管代码中发生了异常。尝试关闭所有“Watch”或“Locals”窗口,这样您就无法查看任何变量的内容,然后查看错误是否仍然存在。
  • @ScottChamberlain 关闭它们,同样的交易

标签: c# visual-studio exception-handling emgucv


【解决方案1】:

将我的应用程序从 EmguCV 2.4.2 迁移到 3.2.0 后,我遇到了同样的问题。在失去一些头发后,我找到了适合我的解决方案。

前往

工具 --> 选项 --> 调试 --> 常规

启用选项使用旧版 C# 和 VB 表达式求值器

根据 VS2015 文档,这将执行以下操作:调试器将使用 Visual Studio 2013 C#/VB 表达式评估器,而不是基于 Visual Studio 2015 Roslyn 的表达式评估器。

对我来说,启用此选项解决了问题。现在显示异常对话框,并且不再终止调试过程。

【讨论】:

    【解决方案2】:

    尝试使用 CvException 而不是 Exception

    道格

    【讨论】:

      【解决方案3】:

      尝试从 catch 块中删除捕获的异常类型。只需如下:

      try
      {
         // logic here...
      }
      catch
      {
          // handler
      }
      

      这应该捕获“异常”特定处理程序未捕获的任何内容。或者只是在现有的 catch 块下方添加一个额外的 catch 块,然后查看该块是否捕获它。

      【讨论】:

      • 仍然没有捕捉到它,即使它捕捉到了,我只需要捕捉它,这样我就可以在学习时看到实际的异常是什么。
      • 你能在某处分享一个测试项目吗?看看发生了什么会很有趣。
      • 另一个想法(可能不是这种情况):默认情况下,VS 调试器会先处理异常,然后再执行处理程序。如果您在第一个异常中断时按“继续” - 它应该继续执行(假设有它的处理程序)。
      • 我会上传项目并发表评论。至于继续,没有办法继续,因为程序几乎立即关闭,VS在关闭程序之前没有超过1/10秒左右的异常中断,我花了很多时间才得到截图例外。
      • 我真的很想调查一下。期待您分享位置的帖子。