关于c#:尝试在不安全的代码中捕获异常

try catch exceptions in unsafe code

我正在编写一些图像处理代码,并使用C进行低级别像素操作。每隔一段时间,就会发生AccessViolationException。

有几种方法可以解决这个典型的问题,有些人认为代码应该写得很牢固,这样就不会有访问冲突异常,而且就我而言,应用程序运行得很好,但是我想添加一个try catch,这样如果发生什么事,应用程序就不会以一种非常丑陋的方式失败。

到目前为止,我已经输入了一些示例代码来测试它。

1
2
3
4
5
6
7
8
unsafe
{
    byte* imageIn = (byte*)img.ImageData.ToPointer();
    int inWidthStep = img.WidthStep;
    int height = img.Height;
    int width = img.Width;
    imageIn[height * inWidthStep + width * 1000] = 100; // make it go wrong
}

当我在这个语句周围放置一个try-catch时,仍然会得到一个异常。是否有方法捕获在不安全块中生成的异常?

编辑:如下面所述,除非通过将此属性添加到函数并添加"using system.runtime.exceptionservices"显式启用了对异常的检查,否则不再处理此类异常。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[HandleProcessCorruptedStateExceptions]
    public void makeItCrash(IplImage img)
    {
        try
        {
            unsafe
            {
                byte* imageIn = (byte*)img.ImageData.ToPointer();
                int inWidthStep = img.WidthStep;
                int height = img.Height;
                int width = img.Width;
                imageIn[height * inWidthStep + width * 1000] = 100; // to make it crash
            }
        }
        catch(AccessViolationException e)
        {
            // log the problem and get out
        }
    }


检查大小,如果参数使您在图像外写入,则返回一个ArgumentOutOfRangeException

AccessViolationException是损坏状态异常(cse),而不是结构化异常处理(seh)异常。从.NET 4开始,除非用属性指定CSE,否则catch(Exception e)不会捕获CSE。这是因为您应该首先编写避免CSE的代码。您可以在这里阅读更多信息:http://msdn.microsoft.com/en-us/magazine/dd419661.aspx id0070035