当前位置:  开发笔记 > 编程语言 > 正文

你能在C#代码中捕获本机异常吗?

如何解决《你能在C#代码中捕获本机异常吗?》经验,为你挑选了5个好方法。

在C#代码中,您可以捕获从某些非托管库中深入抛出的本机异常吗?如果是这样,你需要做任何不同的事情来抓住它或做一个标准的尝试...抓住它吗?



1> Vivek..:

您可以使用Win32Exception并使用其NativeErrorCode属性来适当地处理它.

// http://support.microsoft.com/kb/186550
const int ERROR_FILE_NOT_FOUND = 2;
const int ERROR_ACCESS_DENIED = 5;
const int ERROR_NO_APP_ASSOCIATED = 1155; 

void OpenFile(string filePath)
{
    Process process = new Process();

    try
    {
        // Calls native application registered for the file type
        // This may throw native exception
        process.StartInfo.FileName = filePath;
        process.StartInfo.Verb = "Open";
        process.StartInfo.CreateNoWindow = true;
        process.Start();
    }
    catch (Win32Exception e)
    {
        if (e.NativeErrorCode == ERROR_FILE_NOT_FOUND || 
            e.NativeErrorCode == ERROR_ACCESS_DENIED ||
            e.NativeErrorCode == ERROR_NO_APP_ASSOCIATED)
        {
            MessageBox.Show(this, e.Message, "Error", 
                    MessageBoxButtons.OK, 
                    MessageBoxIcon.Exclamation);
        }
    }
}


我相信这不是自动的,但只有在使用指定它的P/Invoke签名时才会抛出.它是基于Win32错误代码抛出的,而不是Win32异常.

2> trampster..:

Catch without()将捕获非CLS兼容的异常,包括本机异常.

try
{

}
catch
{

}

有关详细信息,请参阅以下FxCop规则 http://msdn.microsoft.com/en-gb/bb264489.aspx


是的,这是真的.在比较日志文件和代码并且认为我放弃它之后花费了几个小时特别烦人的时候,我自己发现了这个.但问题显而易见,是否可以从空catch块中确定本机异常的类型?你可以记录任何有用的东西来识别异常的来源吗?

3> Curt Hagenlo..:

C#和本机代码之间的互操作层将异常转换为托管形式,允许它被C#代码捕获.从.NET 2.0开始,catch (Exception)应该捕获除了不可恢复的错误之外的任何内容.


在C++中,您可以抛出任何对象,因此对于互操作问题,能够捕获不是从Exception派生的对象是有用的.一种常见的情况是C++程序将仅抛出一个String(错误消息).
在.NET 1.x中,抛出的异常可能不是从Exception类派生的,但默认情况下此功能在2.0中关闭

4> Michael Dama..:

在某处使用.NET Reflector我看过以下代码:

try {
  ...
} catch(Exception e) {
  ...
} catch {
  ...
}

嗯,C#不允许抛出不从System.Exception类派生的异常.据我所知,interop marshaller的任何异常包都由继承System.Exception的异常类包装.

所以我的问题是是否可以捕获不是System.Exception的异常.



5> JaredPar..:

这取决于您所谈论的本机异常类型.如果你指的是SEH例外,那么CLR会做两件事之一.

    在已知的SEH错误代码的情况下,它将它映射到适当的.Net异常(即OutOfMemoryException)

    对于不可映射(E_FAIL)或未知代码,它只会抛出一个SEHException实例.

这两个都将被一个简单的"catch(Exception)"块捕获.

可以跨越本机/托管边界的另一种本机异常是C++异常.我不确定它们是如何映射/处理的.我的猜测是,由于Windows在SEH之上实现了C++异常,因此它们只是以相同的方式映射.

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有