在C#代码中,您能捕获从某个非托管库深处抛出的本机异常吗?如果是这样的话,你需要做一些不同的事情来抓住它,还是标准的try …抓住它?

推荐答案

您可以使用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);
        }
    }
}

.net相关问答推荐

使用PowerShell在Windows容器内安装exe

SLN配置文件:映射问题

跨请求共享数据

C#:如何构造异步/等待代码,其中许多请求是针对相同的、返回缓慢的数据发出的,这可以满足所有请求

竖线在 PropertyGroup .csproj 文件中的含义

Msbuild try 构建 msbuild.exe 而不是我的 .csproj 文件

将 Moq 模拟对象传递给构造函数

HttpClient 请求抛出 IOException

JavaScript 中的IsNullOrWhitespace?

有什么方法可以使用 .NET 应用程序使用 git 吗?

使用 IIS Express 托管网站(临时)

找不到 Microsoft.Office.Interop Visual Studio

C# 属性实际上是方法吗?

无法在 Windows 10 上安装 Windows SDK 7.1

关于 Enumerable.Range 与传统 for 循环的 foreach 的思考

MailMessage,Sender 和 From 属性的区别

找不到 System.Windows.Media 命名空间?

程序员应该使用 SSIS,如果是,为什么?

System.ServiceModel 在 .NET Core 项目中找不到

MultipleActiveResultSets=True 还是多个连接?