【问题标题】:C# Process.Start() Continue On If File Not Found?如果找不到文件,C# Process.Start() 继续?
【发布时间】:2013-07-31 21:49:59
【问题描述】:

我希望使用 Process.Start() 来启动可执行文件,但我想继续执行程序,无论可执行文件是成功还是失败,或者 Process.Start() 本身是否引发异常。

我有这个:

        myProcess.StartInfo.UseShellExecute = false;
        // You can start any process, HelloWorld is a do-nothing example.
        myProcess.StartInfo.FileName = "C:\\HelloWorld.exe";
        myProcess.StartInfo.CreateNoWindow = true;
        myProcess.Start();

我知道你可以将它添加到 try catch 中

          try
        {
            myProcess.StartInfo.UseShellExecute = false;
            // You can start any process, HelloWorld is a do-nothing example.
            myProcess.StartInfo.FileName = "C:\\HelloWorld.exe";
            myProcess.StartInfo.CreateNoWindow = true;
            myProcess.Start();
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }

如果找不到文件,尝试捕获版本是否会失败?如何处理 InvalidOperationException Win32Exception ObjectDisposedException 等其他异常

目标只是在失败时继续执行代码......

非常感谢!

【问题讨论】:

  • 为什么不直接使用File.Exists("exeFilePath")
  • "如果找不到文件,尝试捕获版本是否会失败?" - 如果您要捕获所有异常,它应该可以......
  • @Sayse@JonSkeetso 我应该使用 File.Exists 的第一个选项,我应该没问题?我的代码不会抛出 expetion 吗?我不介意执行的 te exe 是否引发异常...
  • 我并不是说该异常不会发生,但它非常不太可能
  • “try catch 版本不会失败”中的“失败”是指“进入 catch 块”还是“程序崩溃”?

标签: c#


【解决方案1】:

应为您期望永远不会发生但可能发生的不测事件保留捕获异常。相反,您可以先尝试检查文件是否存在

var filePath = @"C:\HelloWorld.exe";
if(File.Exists(filePath))
{
     myProcess.StartInfo.UseShellExecute = false;
     // You can start any process, HelloWorld is a do-nothing example.
     myProcess.StartInfo.FileName = filePath ;
     myProcess.StartInfo.CreateNoWindow = true;
     myProcess.Start();
}

编辑

如果您想格外小心,也可以随时使用 try catch,但要捕获特定的异常。

try
{
//above code
}
catch(Win32Exception)
{
}

编辑2

var path = new Uri(
  Path.Combine((System.Reflection.Assembly.GetExecutingAssembly().CodeBase)).LocalPath,
           "filename.exe"));

最终编辑

当捕获到异常时,您的程序会进入 catch 块以允许您采取相应措施,大多数程序倾向于在其中包含某种错误日志记录,因此可以尽可能纠正此错误/错误。暂时你只需要包含一条消息让用户知道发生了意外情况可能是值得的

catch(Win32Exception)
{
MessageBox.Show(this, "There was a problem running the exe");
}

【讨论】:

  • 有些人建议不要这样做,因为在检查文件是否存在和实际阅读文件之间可以删除文件。
  • 而且这种情况是针对例外情况的。但是检查 File.Exists 会降低遇到异常的可能性,这始终是一个好习惯。
  • @JonathanAllen - 你有这个事实的来源吗?我感觉线程在这里没有起作用,在这里检查和使用之前的时间非常短
  • @Sayse:并行始终在起作用。即使您的程序不使用线程,也会有其他进程在运行,并且文件系统是共享资源。除了文件不存在之外,还有其他可能出错的事情(例如,执行它的权限不足,或缺少 DLL)。所以处理失败是必要的。
  • @MarkVoidale - 我添加了获取路径的更好方法的第二次编辑
猜你喜欢
  • 2015-08-26
  • 1970-01-01
  • 2012-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多