如何从Process.Start中抛出FileNotFoundException

时间:2016-09-14 09:56:38

标签: c# file exception process system.diagnostics

我正在尝试在可执行文件上调用Process.Start()。如果找不到该文件,则应将其复制到所需位置,然后重试。

根据the documentation,当Process.Start()

时,FileNotFoundException可以抛出The file specified in the startInfo parameter's FileName property could not be found.

基于此,以下似乎是一种合理的方法:

try
{
    Process.Start(@"C:\users\Angus.McAngerson\desktop\IT Self Help.exe");
}
catch (FileNotFoundException ex)
{
    File.Copy(@"Z:\Unused\Apps\IT Support App\IT Self Help.exe", @"C:\users\Angus.McAngerson\desktop");
    Process.Start(@"C:\users\Angus.McAngerson\desktop\IT Self Help.exe", "vdi");
}

但是,Start()区块中的try只会抛出 Win32Exception

  

System.dll中出现未处理的“System.ComponentModel.Win32Exception”类型异常

     

消息:系统找不到指定的文件

     

ErrorCode:-2147467259

     

NativeErrorCode:2

我尝试将try代码更改为:

var procsi = new ProcessStartInfo(@"C:\users\Angus.McAngerson\desktop\IT Self Help.exe");
Process.Start(procsi);

但结果相同。我还尝试将BuildPlatform更改为x86x6Any CPU但没有任何区别。

为什么会这样?如何抛出FileNotFoundException

更新

文档说明:

FileNotFoundException异常:

  

找不到startInfo参数的FileName属性中指定的文件。

在上面的情况中,找不到该文件,但代码抛出了另一个异常。如果不是完全不真实的话,这至少是非常误导的。

我能想到的唯一解释是程序尝试运行该文件而不检查它是否存在。这是公平的,但是在FileNotFoundException甚至会发生什么情况?

这是文档中的错误吗?

3 个答案:

答案 0 :(得分:2)

在catch中执行语句真的不是一个好主意,除非它们与异常跟踪有关。

我不明白为什么你不能使用File.Exists(因为你打算不对FileNotFoundException做任何事情)。如果我们重写您的代码,那么它将是:

if (File.Exists(@"C:\users\Angus.McAngerson\desktop\IT Self Help.exe"))
{
    Process.Start(@"C:\users\Angus.McAngerson\desktop\IT Self Help.exe");
}
else
{
    File.Copy(@"Z:\Unused\Apps\IT Support App\IT Self Help.exe", @"C:\users\Angus.McAngerson\desktop\IT Self Help.exe");
    Process.Start(@"C:\users\Angus.McAngerson\desktop\IT Self Help.exe", "vdi");
}

答案 1 :(得分:1)

如果您查看Process.Start的文档,您会注意到有一个例外条件表,包括:

Win32Exception - 打开关联文件时出错。

FileNotFoundException - PATH环境变量有一个包含引号的字符串。

即使例外有点误导,它看起来对我的行为也是正确的

答案 2 :(得分:0)

如果你看这里:https://msdn.microsoft.com/en-us/library/system.componentmodel.win32exception(v=vs.110).aspx

它会告诉您在尝试打开不存在的可执行文件时会得到Win32Exception。

实际上,您的代码似乎运行正常。

但是如果你真的想要一个FileNotFoundException,那么在运行这个过程之前你必须自己做一些检查并自己抛出异常。

if(!File.Exists(@"C:\users\Angus.McAngerson\desktop\IT Self Help.exe"))
{
     throw new FileNotFoundException("This file was not found.");
}

修改

似乎文档中可能存在错误,因为即使它声称能够执行,我也无法抛出FileNotFoundException

因此,您可以处理Win32Exception或执行上面建议的操作。

也许其他人可以阐明这一点?