2016-11-27 73 views
0

在某些计算机上,当我打电话Process.Start()开始帮助我的可执行文件,我得到以下异常抛出:手柄Win32Exception通过的Process.Start()

System.ComponentModel.Win32Exception (0x80004005): The system cannot find the file specified 
at System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo) 
at System.Diagnostics.Process.Start() 

的问题:当我Win32Exception,我想告诉是否这是我描述的“找不到文件”异常或其他内容。如何可靠地做到这一点?我应该比较这个0x80004005,还是应该解析错误信息?

一些解释:由于某种原因,可执行文件可能会被删除(这就是为什么没有找到文件)。这是一个预期的情况。如果因为其他原因抛出异常,我想报告它。

+1

'0x80004005'是[E_FAIL](https://msdn.microsoft.com/en-us/library/windows/desktop/aa378137(v = vs.85).aspx)。这是非常通用的,不会有帮助。 [NativeErrorCode](https://msdn.microsoft.com/en-us/library/system.componentmodel.win32exception.nativeerrorcode(v = vs.110).aspx)可能会带来更好的运气。 – GSerg

回答

2

这是怎么样,我相信,它应该做的事:

public static int E_FAIL = unchecked((int)0x80004005); 
public static int ERROR_FILE_NOT_FOUND = 0x2; 

// When the exception is caught 

catch (Win32Exception e) 
{ 
    if(e.ErrorCode == E_FAIL && e.NativeErrorCode == ERROR_FILE_NOT_FOUND) 
    { 
    // This is a "File not found" exception 
    } 
    else 
    { 
    // This is something else 
    } 
} 

E_FAIL是HRESULT value,ERROR_FILE_NOT_FOUND是一个system error code

不应该使用错误消息,因为它依赖于文化,实际上是系统错误代码的翻译。

-3

使用try-catch块来捕获“Win32Exception”并相应地在catch块中显示错误。如果您想检查文件是否存在,或者不使用System.IO命名空间中的File.Exists()方法。我的建议是检查文件是否发生异常,并相应地显示错误消息,无论文件是否存在或进程无法启动。

+0

我想到了它,但不推荐使用'File.Exists()',因为它很容易出现竞争条件:在File.Exists()返回后文件可能会被快速删除。我可能会尝试打开可执行文件,但同样的事情,关闭它之后,执行它之前,它可能会被删除。 –

+0

然后运行一个方法,通过线程通信或使用“FileSystemWatcher”对象,在不同的线程上调用File.Exists(),并在文件不存在的情况下立即显示错误(因为可执行文件在移除后不可能存在)。 – hecate

+2

Andrey完全正确,File.Exists()容易受到竞争条件的影响。该文件可以在File.Exists()返回的时间与您尝试并使用它的时间之间删除。在另一个线程上做它不能解决这个问题。你解决这个问题的方式只是为了确保你处理由执行文件I/O的函数引发的任何异常。这是执行文件I/O的* all *函数的标准。如果需要,仍然可以使用File.Exists(),以帮助最大限度地减少引发异常的可能性,但是不能用*代替异常处理程序。 –