如何捕获异常并继续程序? C#

时间:2009-11-15 23:53:14

标签: c# exception try-catch

我需要检查一下他们输入的文件是否存在,我怎么能这样做,我尝试使用try&抓住它并没有效果

if (startarg.Contains("-del") == true)
            {
                //Searches "Uninstallers" folder for uninstaller containing the name that they type after "-del" and runs it
                string uninstalldirectory = Path.Combine(Directory.GetCurrentDirectory(), "Uninstallers");
                DirectoryInfo UninstallDir = new DirectoryInfo(uninstalldirectory);
                string installname = startarg[2].ToString();
                //Removes file extesion "-del "
                installname.Remove(0, 5);
                string FullFilePath = Path.Combine(uninstalldirectory, installname);
                try
                {
                    //Makes the uninstaller invisible to the user and sets other settings
                    Process Uninstaller = new Process();
                    Uninstaller.StartInfo.FileName = FullFilePath;
                    Uninstaller.StartInfo.UseShellExecute = false;
                    Uninstaller.StartInfo.CreateNoWindow = true;
                    Uninstaller.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                    Uninstaller.Start();
                }
                //Only is run if the package isn't installed
                catch (System.Exception)
                {
                    Console.WriteLine("The specified package is not installed, you most likely mispelled it or didnt put quotes around it, try again");
                }

            }

大部分代码都是获取当前目录并向其添加“卸载程序”。

编辑: 调试结果是ArgumentOutOfRangeException

我尝试使用File.Exists if语句,否则它仍会崩溃

编辑#2:

关于我要对这个程序做些什么:我正在尝试编写一个跨平台(有单声道,还没有移植它,因为我不喜欢MonoDevelop)包管理器,这个是删除包的功能。它通过获取应用程序的Uninstallers文件夹中的卸载脚本来获取已安装应用程序的列表。我希望它与目录无关,所以我得到了当前目录

如果文件存在,我的代码工作正常,但是当它不存在时,它会崩溃我的问题

3 个答案:

答案 0 :(得分:6)

您尚未指定所看到的结果,因此您的问题难以诊断。不过,我可以看到一些可能的问题:

  • Path.Combine可以抛出异常 如果它的参数包含字符 路径无效。你没有 包裹您的Path.Combine来电 try-catch blocks。
  • 如果您的代码需要一个文件或 存在给定路径的目录, 你最好用它来检查 File.ExistsDirectory.Exists 打电话,而不是依赖于 异常。 关于使用File.Exists时的竞争条件,Joel Coehoorn在评论中提出了一个很好的观点。
  • 剥离你的“-del” 命令行参数是公平的 处理参数的容易出错的方法。 有什么理由你不能简单 期望指令(“ - del”) 第一个参数和路径 是第二个论点?

编辑:在其他地方阅读了您的回复后,我发现了另一个问题:

 //Removes file extesion "-del "
 installname.Remove(0, 5);

这不符合你的想法。您需要将该行的结果分配回installName

installname = installname.Remove(0, 5);

我还担心你期望一个指令和路径以某种方式组合到你的第三个命令行参数中。如果你像这样调用你的应用程序:

myapp.exe foo bar -del "C:\myfile.txt"

然后您的命令行参数将如下所示:

args[0] // foo
args[1] // bar
args[2] // -del
args[3] // C:\myfile.txt

换句话说,“ - del”和你的文件路径将在不同的参数中。

答案 1 :(得分:3)

依靠异常进行正常处理并不是一件好事。您可以使用File.Exists() function检查文件是否存在,如果它没有写入警报并允许他们选择其他文件。所以它可能看起来像

if(File.Exists(FullFilePath))
{
   //uninstall
}
else
{
   Console.WriteLine("The specified package is not installed, you most likely mispelled it or didnt put quotes around it, try again");
}

答案 2 :(得分:3)

try-catch没有任何效果,因为try块之外的代码抛出了异常。正如其他答案所指出的那样,您可以对代码进行一些改进,以便在真正特殊情况下调用异常处理。