Как поймать Exception и продолжить программу? C # - PullRequest
1 голос
/ 16 ноября 2009

Мне нужно проверить, существует ли файл, который они вводят. Как я могу это сделать, я попытался использовать try & catch, и это не дало эффекта

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");
                }

            }

Большая часть этого кода получает текущий каталог и добавляет к нему «Деинсталляторы».

Edit: Результатом отладки является ArgumentOutOfRangeException

Я попытался использовать оператор File.Exists if и другие, и он все еще вылетает

Правка № 2:

Немного о том, что мне делать с этой программой: я пытаюсь написать кроссплатформенный (с моно, еще не портировал его, потому что мне не нравится MonoDevelop) менеджер пакетов, и это это функция, которая удаляет пакеты. Он получает список установленных приложений, получая сценарии удаления в папке Uninstallers приложения. Я хочу, чтобы он был независимым от каталога, поэтому он должен получить текущий каталог

Мой код работает нормально, если файл существует, но когда он не работает, это моя проблема

Ответы [ 3 ]

6 голосов
/ 16 ноября 2009

Вы не указали результаты, которые видите, поэтому вашу проблему сложно диагностировать. Я вижу несколько возможных проблем:

  • Path.Combine может выдавать исключения если его аргументы содержат символы неверно в путях. У вас нет завершили ваши Path.Combine звонки в блоки try-catch.
  • Если ваш код требует, чтобы файл или каталог по заданному пути существует, вам лучше проверить это с File.Exists или Directory.Exists звоните, а не в зависимости от исключение. Джоэл Коухорн (Joel Coehoorn) делает хороший комментарий в своем комментарии относительно условий гонки при использовании File.Exists.
  • Снятие "-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» и ваш путь к файлу будут в отдельных аргументах.

3 голосов
/ 16 ноября 2009

Try-catch не имеет никакого эффекта, потому что исключение генерируется кодом, который находится за пределами блока try. Как указывают другие ответы, есть несколько улучшений, которые вы можете внести в свой код, чтобы ваша обработка исключений вызывалась для действительно исключительных условий.

3 голосов
/ 16 ноября 2009

Не стоит полагаться на исключения для обычной обработки. Вы можете проверить, существует ли файл, используя функцию File.Exists () , и если он не записывает ваше предупреждение, и разрешить им выбрать другой файл. Так что это может выглядеть как

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");
}
...