2010-09-17 3 views
3

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

Какой базовый класс исключений я должен получить и почему?

ответ

6

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

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

С каким классом вы должны исходить?

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

+1

У вас есть ссылка на эту рекомендацию Microsoft относительно ApplicationException и Exception? Мне интересно это прочитать. –

+0

есть ли какая-либо конкретная причина, почему вы получаете из System.Excption, а не из ApplicationException? – Moon

+0

@ Pierre-Alain Vigeant and Ruby - Посмотрите на обсуждение здесь http://blogs.msdn.com/b/kcwalina/archive/2006/06/23/644822.aspx и http: //blogs.msdn .com/b/brada/archive/2004/03/25/96251.aspx ... это может помочь прояснить, почему. – InSane

1

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

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

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

0

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

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

редактировать

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

2

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

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

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)

+0

Как «ArgumentOutOfRangeException» не распространяется на ваш случай? Это аргумент, и это вне пределов досягаемости. Почему вас это волнует, если это «цифра» или нет? –

+0

Вы правы. ArgumentOutOfRangeException определенно охватывает этот случай. Я просто искал быстрый, простой пример, и это было первое, что пришло в голову. –

2

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

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

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

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

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

1

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

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

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

Однако я бы сделал это только в том случае, если я обработал их в своем UI-коде явно.