gpt4 book ai didi

c# - 处理 "application not found"等特定 Win32 异常的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-05 05:13:13 25 4
gpt4 key购买 nike

我使用该文件类型的默认应用程序启动一个进程,但如果用户删除了他的默认应用程序,则会抛出 Win32Exception。此外,还有其他情况会抛出 Win32Exception,例如如果用户无权打开默认应用程序。

现在我正在寻找区分异常的最佳方法。

我如何检查到底抛出了哪个异常?是否只能通过其异常消息来检查它?

我是这样捕捉它的:

        try
{
process.Start();
}
catch (Win32Exception exc)
{
//How to check which exception exactly is thrown?
return return string.Format("Process cannot be started", exc.Message)
}

这是我的第一个想法,但我认为有更好的方法来完成这项任务:

catch (Win32Exception exc)
{
if(exc.Message == "Application not found")
{
//Do something
}
else if(exc.Message == "Another exception")
{
//Do something else
}
}

最佳答案

对于 Win32Exception,您可能需要检查两者 Win32Exception.NativeErrorCode 及其继承的 ExternalException.ErrorCode 值。

C# 6 引入了异常过滤器,如果您打算重新抛出异常,它允许您选择加入处理异常而无需过早倒回堆栈。

Windows 中的错误代码主要分为三种类型:HRESULT、Win32 错误代码和 COM 错误代码。


关于您的问题:“找不到应用程序”错误消息来自 COM:CO_E_APPNOTFOUND 并且是 0x800401F5 - 但奇怪的是它在 Win32Exception< 中返回 而不是 COMException

有趣的是.NET Framework(我没有检查.NET Core),Process.Start always throws Win32Exception for both the UseShellExecute == true and false branches .但是当 UseShellExecute == true 然后使用 COM 时,COM 错误被简单地传递到 Win32Exception 的构造函数中并且它神奇地工作(因为 Win32Exception 调用 FormatMessage 从错误代码中获取人类可读的错误消息,并且 FormatMessage 支持返回 Win32、HRESULT 和 COM 状态代码的错误消息(因为它们一般不重叠)。

...这意味着我们只需要这样做:

const Int32 CO_E_APPNOTFOUND = unchecked( (Int32) 0x800401F5 );

try
{
ProcessStartInfo psi = new ProcessStartInfo( "https://www.stackoverflow.com" );
psi.UseShellExecute = true;
psi.Verb = "open";

using( Process p = Process.Start( psi ) )
{
p.WaitForExit();
}
}
catch( Win32Exception w32Ex ) when ( w32Ex.NativeErrorCode == CO_E_APPNOTFOUND )
{
MessageBox.Show( "You don't have a web-browser installed or configured correctly." );
}

关于c# - 处理 "application not found"等特定 Win32 异常的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53882484/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com