Как вы называете и систематизируете свои исключения? - PullRequest
7 голосов
/ 11 ноября 2011

При введении новых типов исключений я всегда не уверен, как это сделать правильно.Есть ли общее соглашение?Как ты делаешь это?

Меня интересует сфера, в которой вы их организуете (держите их в том блоке, в котором они используются? Есть блок на уровне компонентов? Уровень пакетов? Приложение?)

Это также влияет на наименование.Какой контекст вы включаете?Лучше сделать их очень конкретными (например, EPersonIDNotFoundError) или попытаться сделать их повторно используемыми (например, ENotFoundError)?

А как насчет суффикса «Ошибка» - когда мне его добавлять и когда оставлять?Я не вижу логики, например, в Classes.pas:

  EWriteError = class(EFilerError);
  EClassNotFound = class(EFilerError);
  EResNotFound = class(Exception);

Ответы [ 4 ]

6 голосов
/ 11 ноября 2011

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

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

EConvertError, EMathError, EVariantError

vs

EAccessViolation, EInvalidPointer, EZeroDivide

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

Эти примеры можно найти в SysUtils, может быть, вы можете посмотреть там, потому что он содержит много классов исключений, а также базовые классы для еще большего количества исключений.Очень немногие из них заканчиваются на Exception, за исключением некоторых очень специфических ошибок, с которыми вы действительно никогда не столкнетесь, таких как EHeapException и ESafecallException.

1 голос
/ 11 ноября 2011

В какой сфере их организовывать?

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

Как насчет имен?

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

А как насчет постфикса "Ошибка"?

Хватит думать об этом. Добавьте это. Если это не звучит глупо.

1 голос
/ 11 ноября 2011

Обычно для простых приложений вы можете использовать Exception.Create ('ErrorMessage'). Когда исключения становятся мощными, они могут определить, какой ответ требуется, взглянув на класс. Delphi уже делает это с помощью процедуры Abort, которая вызывает EAbort. EAbort является «особенным» в том смысле, что он не вызывает «ошибку» как таковую, то есть это своего рода «тихое» исключение. Вы можете использовать это специфичное для класса действие, чтобы исследовать исключение и делать разные вещи. Вы можете создать EMyWarning, EMyVeryNastyError и т. Д., Каждый из которых происходит от базового типа исключения.

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

EMyException = class( Exception )
  constructor Create( const AErrorMessage : string; AErrorCode : integer ); reintroduce;
PUBLIC
  ErrorCode : integer
end;

constructor EMyException.Create( const AErrorMessage : string; AErrorCode : integer );
begin
  inherited Create( AErrorMessage );
  ErrorCode := AErrorCode;
end;

Теперь у вас есть возможность установить «ErrorCode», когда вы вызываете исключение, и вы имеете его доступным, когда исключение перехватывается. Исключения довольно мощные.

1 голос
/ 11 ноября 2011

При создании нового исключения я делаю это приложение широким. Я начинаю с самой подробной ошибки с самой общей, например, с класса (Исключение), и называю их соответственно.

Итак, в вашем примере я бы использовал EPersonIDNotFoundError, ENotFoundError, Exception.

Это действительно зависит от того, сколько деталей вы хотите получить от своих сообщений об ошибках и что вы включаете в свой журнал (если вы ведете журнал ошибок)

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