【问题标题】:Getting original exception when ProcessStartInfo ErrorDialog = true当 ProcessStartInfo ErrorDialog = true 时获取原始异常
【发布时间】:2014-04-16 16:49:27
【问题描述】:

当使用这样的代码时(我没有权限访问 excel.exe,这是故意的):

ProcessStartInfo psi = new ProcessStartInfo("EXCEL.exe");
psi.UseShellExecute = true;
psi.ErrorDialog = true;
Process.Start(psi);

我收到了不错的 Windows 错误对话框,其中包含有关缺少权限的适当消息。这 100% 没问题,但只有当我不想记录此错误时。

假设我想使用如下代码记录它:

try
{
    ProcessStartInfo psi = new ProcessStartInfo("EXCEL.exe");
    psi.UseShellExecute = true;
    psi.ErrorDialog = true;
    Process.Start(psi);
}
catch(Win32Exception ex)
{
    LogError(ex.Message) //FAIL! "The operation was canceled by the user" instead of "Access denied"
}

似乎原始异常丢失了,无论我没有权限或没有安装 excel,我总是得到相同的异常代码(消息)。

还有其他方法可以做到这一点吗?

【问题讨论】:

    标签: c# .net processstartinfo


    【解决方案1】:

    异常丢失了,因为您使用的是UseShellExecuteErrorDialog,所以它们发生在 Windows Shell 中,而不是您的进程中,因此不在 .NET 运行时中,因此没有要捕获的异常。相反,您为什么不将这两个属性都设置为false(或至少ErrorDialog 属性),捕获异常,记录它,然后显示您自己的错误对话框?

    【讨论】:

    • 感谢您的快速回答。我的意图是保留原始 Windows 消息并使用 ErrorDialog = false 我必须自定义编写它们:/ 例如“Windows 无法访问指定的设备、路径或文件。您可能没有访问该项目的适当权限。” (Windows 错误对话框)!=“拒绝访问”(来自错误代码)
    • 即使你不想想要,为了得到你需要的行为你可能不得不。当然MessageBox.Show(ex.Message) 不是很多工作吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    • 2021-05-08
    • 2014-05-11
    • 2013-10-19
    • 1970-01-01
    • 2019-02-28
    • 2011-01-03
    相关资源
    最近更新 更多