Свой Exception (с шахматами и поэтессами)

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Свой Exception (с шахматами и поэтессами)

Сообщение Brainenjii »

Захотел расширить стандартный Exception кодом ошибки.

Код: Выделить всё

Type

{ BExceptionClass }

 BExceptionClass = Class(Exception)
  Private
    bCode: Integer;
  Public
    Property Code: Integer Read bCode;
    Constructor Build(Const aCode: Integer; Const aMessage: String);
    Constructor Build(Const aCode: Integer; Const aMessageMask: String;
      Const aParams: Array Of Const);
    Destructor Burn;
End;
..
Constructor BExceptionClass.Build(Const aCode: Integer; Const aMessage: String);
Begin
  bCode := aCode;
  Inherited Message := aMessage;
End;

Constructor BExceptionClass.Build(Const aCode: Integer;
  Const aMessageMask: String; Const aParams: Array Of Const);
Begin
  bCode := aCode;
  Inherited Message := Format(aMessageMask, aParams);
End;

Всё хорошо, но как теперь в одном Try'e обрабатывать 2 типа Exception'a?

Код: Выделить всё

Begin
Try
  Case Random(3) Of
    0: StrToInt('blah');
    1: Raise BExceptionClass.Build(147, 'Тупо не повезло');
    2: WriteLn('Epic win');
    Else
      Raise BExceptionClass.Build(148, 'WTF?!!!111oneone');
  End;
Except On E: BExceptionClass Do
  WriteLn(E.Code, ' :: ', E.Message);
End;

Вариант с

Код: Выделить всё

Except On E: Exception Do
  If E Is BExceptionClass Then WriteLn(BExceptionClass(E).Code, ' :: ', E.Message)
  Else WriteLn('-1 :: ', E.Message);

представляется несколько громоздким... Вложенный Try - ещё хуже... Нет ли способа адекватней?
kipar
новенький
Сообщения: 78
Зарегистрирован: 04.03.2010 11:15:54

Сообщение kipar »

A

Код: Выделить всё

Try
...
Except
  On E: BExceptionClass Do
    WriteLn(E.Code, ' :: ', E.Message);
  on E: Exception do
    WriteLn(E.Message);
End;

не работает?
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

Вот примерно это я и хотел увидеть ^_^ Спасибо. Как-то ещё краче это можно реализовать?
kipar
новенький
Сообщения: 78
Зарегистрирован: 04.03.2010 11:15:54

Сообщение kipar »

Я не понимаю что значит еще краче? Чтобы одним оператором оба типа исключений обрабатывать? Тогда наверное в конструкторе присвоить Message := IntToStr(Code)+'::'+Message;
Ответить