.net исключения - PullRequest
       13

.net исключения

3 голосов
/ 17 сентября 2010

Когда мне следует создавать свой собственный класс исключений, а не использовать класс, предоставленный .Net?

Из какого базового класса исключений следует исходить и почему?

Ответы [ 6 ]

6 голосов
/ 17 сентября 2010

Зачем создавать свое собственное исключение?

Вы создаете свое собственное исключение, чтобы при его выбросе вы могли иметь определенные перехваты и, следовательно, отличать их от системных исключений (необработанных).

Из какого класса вы должны получить его?

Ранее, это была стандартная практика для пользовательских исключений, производных от класса ApplicationException, но с течением времени рекомендации MS изменились, побуждая разработчиков исходить из System.Exception, а не ApplicationException

2 голосов
/ 17 сентября 2010

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

public class MyLibraryException : Exception
{
    // .....
}

Затем я создам исключение для ситуаций, которые могут возникнуть при использовании библиотеки.

public class SomethingHorribleException : MyLibraryException 
{
    // .....
}

Тогдаклиент всегда может знать, что моя библиотека выдаст что-то, что унаследует MyLibraryException.

2 голосов
/ 17 сентября 2010

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

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

private string ToRoman(int number)
{
    if (number > 0 && number < 4000)
    {
        //ConvertHere
    }
    else
    {
        //Custom exception used for readability purposes.
        throw new NumeralOutOfRangeException();
    }
}

Что касается используемого базового класса, Microsoft рекомендует, чтобы определяемые пользователем исключения составляли подкласс Exception.(http://msdn.microsoft.com/en-us/library/seyhszts.aspx)

1 голос
/ 17 сентября 2010

Пока все ответы выглядят хорошо, но я бы добавил:

Чтобы скрыть детали реализации, которые могли бы быть раскрыты, потому что вам нужно обработать эти исключения.

например. Вы не хотите, чтобы ваш интерфейс перехватывал SQLException. Вы должны выбросить свои собственные исключения из своего кода доступа к данным и позволить своему пользовательскому интерфейсу справиться с ними. Если вы перешли на хранение данных, не относящееся к поставщику баз данных (например, XML, файловая система и т. Д.), Вам не нужно будет менять код пользовательского интерфейса.

Однако я сделал бы это, только если бы явно обрабатывал их в своем коде пользовательского интерфейса.

1 голос
/ 17 сентября 2010

Одной из причин создания вашего собственного исключения является возможность изолировать их для отлова. Например:

try {
// do stuff
} catch (MyCustomException e) {
// handle this known exception
}

Все остальные исключения могут всплывать и обрабатываться на другом уровне.

0 голосов
/ 17 сентября 2010

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

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

edit

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...