Программно подавление исключений в C # - PullRequest
1 голос
/ 15 декабря 2009

У меня есть следующий оператор try-catch, и я не хочу не генерировать исключение, если свойство сообщения содержит «Моя ошибка» в тексте.

Как я могу программно выполнить это? Кроме того, это будет считаться запахом кода?

try
{
}
catch(Exception e)
{
    if(e.Messages.Contains("My error"))
    {
       //want to display a friendly message and suppress the exception
    }
    else
    {
        throw e;
    }
}

Ответы [ 4 ]

14 голосов
/ 15 декабря 2009

Вы не должны ловить ошибки, основываясь на тесте ошибок. Вы должны создать свой собственный класс исключений, который расширяет исключение:

class MyErrorException : Exception { }

и бросай и лови их. (Извините за синтаксис, если он неправильный, я давно не делал C #).

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

11 голосов
/ 15 декабря 2009

Вы должны поймать конкретное исключение, которое вы ищете. Откровенно говоря, этот код шокирует. Вы должны иметь что-то вроде ...

public class MyCoolException : Exception {
    public MyCoolException(string msg) : base(msg) {}
}

public void MyCoolMethod() {
    // if bad things happen
    throw new MyCoolException("You did something wrong!");
}

Тогда позже в вашем коде вы можете использовать его как ...

try {
    MyCoolMethod();
} catch (MyCoolException e) {
    // do some stuff
}
7 голосов
/ 15 декабря 2009

Ваш код создает проблемы сопровождения, потому что простое изменение текста может иметь странные побочные эффекты. Вы можете иметь свой собственный класс исключений, который наследуется от System.Exception. Тогда вместо того, чтобы, если вы могли бы сделать следующее:

try
{

}
catch(MyException myException) //or just catch(MyException)
{
    //display a friendly message
}

также вы не хотите делать throw e, потому что он не сохраняет стек, просто throw; сделает.

0 голосов
/ 15 декабря 2009

Когда я выбрасываю исключение, а не производный класс, я всегда имею в виду ошибочное утверждение. Мне не нравится отказывать в бэкэнде, потому что мы все еще можем получить запрос (только не тот, который снова). Если мы действительно тост, это все равно будет просто ошибка при следующем запросе.

Когда внутреннему серверу нужно сгенерировать сообщение об ошибке, у меня есть класс ErrorMessage, который наследуется от Exception и принимает в качестве аргументов конструктора ErrorMessage и ErrorMessageTitle.

...