Я пытаюсь поймать исключение в блоке try catch моего кода. У меня мало ошибок, таких как неправильный пароль/файл, который не найден, которые имеют конкретные сообщения, и я хочу установить коды, если какая-либо ошибка обнаружена. Я пытаюсь поймать сообщение, используя переключатель.
catch (Exception ex)
{
switch (ex.Message.ToString())
{
case "Can't get attributes of file 'p'":
Debug.WriteLine("wrong username/password");
MainController.Status = "2";
break;
case "Can't get attributes of file 'p'.":
Debug.WriteLine("File is not Available");
MainController.Status = "3";
break;
default:
Debug.WriteLine("General FTP Error");
MainController.Status = "4";
break;
}
}
Я хочу использовать метод message.contains, чтобы, если я получаю какую-либо часть сообщения об ошибке в ex.message, тогда он должен вызвать соответствующий случай, но я не могу понять, как использовать ex.message.contains. Может кто-нибудь мне помочь?
Я настоятельно рекомендую реорганизовать ваш код, чтобы использовать пользовательские обработчики исключений, а не полагаться на этот подход "магических строк". Этот подход не только сложно поддерживать, но и трудно тестировать и отлаживать, поскольку ошибки орфографии не будут улавливаться компилятором.
Например, вы можете создать следующие обработчики исключений:
// Note: can probably be better handled without using exceptions
public class LoginFailedException : Exception
{
// ...
}
// Is this just a FileNotFound exception?
public class FileNotAvailableException : Exception
{
// ...
}
public class FtpException : Exception
{
// ...
}
После этого вы могли бы получить каждое исключение отдельно:
try
{
// ...
}
catch (LoginFailedException)
{
Debug.WriteLine("wrong username/password");
MainController.Status = "2";
}
catch (FileNotAvailableException)
{
Debug.WriteLine("File is not Available");
MainController.Status = "3";
}
catch (FtpException)
{
Debug.WriteLine("General FTP Error");
MainController.Status = "4";
}
Этот подход безопасен по типу и позволяет легко тестировать и отлаживать ваши методы. Это также препятствует тому, чтобы опечатка вызывала часы сложной отладки.
System.IO.File.Move
который генерирует общее IOException
в случае, если (1) источник не найден, (2) цель уже существует, (3) источник уже используется. Боюсь, у меня нет выбора для сравнения сообщений об исключениях. :(
Не делайте этого, вместо этого используйте отдельные блоки catch
для каждого типа Exception
.
Contains
вам придется отказаться отswitch
и использовать вместо негоif...else
.