Попробуйте поймать сообщение с помощью оператора switch

1

Я пытаюсь поймать исключение в блоке 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. Может кто-нибудь мне помочь?

  • 1
    Если вы хотите использовать Contains вам придется отказаться от switch и использовать вместо него if...else .
Теги:
try-catch

2 ответа

4
Лучший ответ

Я настоятельно рекомендую реорганизовать ваш код, чтобы использовать пользовательские обработчики исключений, а не полагаться на этот подход "магических строк". Этот подход не только сложно поддерживать, но и трудно тестировать и отлаживать, поскольку ошибки орфографии не будут улавливаться компилятором.

Например, вы можете создать следующие обработчики исключений:

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

Этот подход безопасен по типу и позволяет легко тестировать и отлаживать ваши методы. Это также препятствует тому, чтобы опечатка вызывала часы сложной отладки.

  • 0
    Конечно, это то, что вы должны делать предпочтительнее, но что, если у вас есть метод фреймворка? Как и System.IO.File.Move который генерирует общее IOException в случае, если (1) источник не найден, (2) цель уже существует, (3) источник уже используется. Боюсь, у меня нет выбора для сравнения сообщений об исключениях. :(
1

Не делайте этого, вместо этого используйте отдельные блоки catch для каждого типа Exception.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню