Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.12;
Скачать: CL | DM;

Вниз

Raising exceptions   Найти похожие ветки 

 
Andy BitOff ©   (2004-08-23 11:49) [0]

Здравствуйте.
Как мне правильно возбудить исключение, чтобы те, кто будут его обрабатывать использовали свои стандартные обработчики, а не писали, специально под меня новые. Смысл в том, что допустим в моем коде вдруг обнаружилось, что вызывающая программа передала в процедуру/функцию имя несуществующего файла. Я первой же строкой это проверил и мне надо создать исключение стандартного вида, чтобы в вызывающей функции сработал стандартный обработчик, например такой:

...
on IO : EInOutError do begin
 case IO.errorcode of
   2:  // файл не найден
   3:  // и т.д.
   4:
 end;
end;
...


 
DiamondShark ©   (2004-08-23 12:01) [1]

Заскок какой-то...


 
Skier ©   (2004-08-23 12:07) [2]


>  и мне надо создать исключение стандартного вида, чтобы
> в вызывающей функции сработал стандартный обработчик,


raise EInOutError.Create("Командир должен думать, а не шашкой махать !");


 
Vitaly ©   (2004-08-23 12:16) [3]

raise EInOutError.Create("Ты лучше Светку возбуди!");


 
Andy BitOff ©   (2004-08-23 12:17) [4]

Чего, и все 8\ А кто создаст IO.errorcode?


 
Andy BitOff ©   (2004-08-23 13:04) [5]

Вы меня наверное не поняли или я плохо объяснил. Попробую еще раз.


procedure Tfrm_Main.SomeProc(FileName: string);
begin
 if FileExists(FileName) then begin

 end
 else Raise EInOutError.Create("Файл не найден.");
end;

procedure Tfrm_Main.Button1Click(Sender: TObject);
begin
 try
   SomeProc("aaaa");
 except
   on IO : EInOutError do begin
     case IO.errorcode of
       2: ShowMessage("2");; // файл не найден
       3: ShowMessage("3");; // и т.д.
       4: ShowMessage("4");;
     end;
   end;
 end;
end;


Так обработчик исключений в Button1Click не отработает. А надо чтобы отработал с кодом 2


 
DiamondShark ©   (2004-08-23 13:13) [6]

Вообще-то, EInOutError не предназначено для возбуждения в пользовательском коде, оно возбуждается подсистемой в/в паскаль-библиотеки.

Но если очень хочется, то

procedure Tfrm_Main.SomeProc(FileName: string);
var
 E: EInOutError;
begin
if FileExists(FileName) then begin

end
else
 begin
   E := EInOutError.Create("Файл не найден.");
   E.ErrorCode := 2;
   Raise E;
 end
end;

Но это криво.

На самом-то деле, никакого IO у вас ещё происходит.
Может лучше ввести свои классы исключений?


 
Григорьев Антон ©   (2004-08-23 13:15) [7]

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


 
Andy BitOff ©   (2004-08-23 13:17) [8]

Вот спасибо, а то некоторые особо умные пытаются тут острить :(


 
KSergey ©   (2004-08-23 13:26) [9]

А не проще ничего не проверять - и система сама сгенерит правильное исключение при попытке доступа к несуществующему файлу?


 
DiamondShark ©   (2004-08-23 13:28) [10]

"Какие негодяи!" (ц)


 
Andy BitOff ©   (2004-08-23 14:16) [11]

Вообще-то я может не корректно поставил вопрос. На самом деле это отсутствие файла должно проверяться в конструкторе некоего класса, отсюда еще вопросы. Как в конструкторе реализовать это исключение (правильно), то что привел DiamondShark © в [6] прекрасно работает, но боюсь это не совсем корректно.
И еще будет ли создан в этом случае класс (при завершении конструктора исключением)?


 
KSergey ©   (2004-08-23 14:31) [12]

> [11] Andy BitOff ©   (23.08.04 14:16)
> И еще будет ли создан в этом случае класс (при завершении
> конструктора исключением)?

Нет.

Так чем же плох подход из [9] - можн опояснить?


 
Andy BitOff ©   (2004-08-23 14:46) [13]

Да вобщем то не плох. В принципе можно и так, я просто привык делать всякие проверки и соответственно на них реагировать. Но в данном случае наверно указанный тобой подход подойдет лучше всего, т.к. следующяя строчка после проверки сущуствования файла F:=TIniFile.Create(FileName); Соответственно, при отсутствии файла будет исключение (правильное) и т.д.

Спасибо. Пока вопросов нет.


 
Andy BitOff ©   (2004-08-23 15:00) [14]

Хотя почему-то F:=TIniFile.Create(FileName); не вызывает исключения.


 
DiamondShark ©   (2004-08-23 16:01) [15]

При исключении в конструкторе будет вызван деструктор и исключение распространится дальше. Это вполне корректная ситуация.


> Хотя почему-то F:=TIniFile.Create(FileName); не вызывает
> исключения.

Так задумано.
Если будет запись, то будет создан новый ини.


 
Andy BitOff ©   (2004-08-23 16:35) [16]

Значит в этой ситуации как раз и надо напить как DiamondShark ©   (23.08.04 13:13) [6]


 
icWasya ©   (2004-08-24 12:40) [17]

ну а если посмотреть SysUtils ??


function CreateInOutError: EInOutError;
type
 TErrorRec = record
   Code: Integer;
   Ident: string;
 end;
const
 ErrorMap: array[0..6] of TErrorRec = (
   (Code: 2; Ident: SFileNotFound),
   (Code: 3; Ident: SInvalidFilename),
   (Code: 4; Ident: STooManyOpenFiles),
   (Code: 5; Ident: SAccessDenied),
   (Code: 100; Ident: SEndOfFile),
   (Code: 101; Ident: SDiskFull),
   (Code: 106; Ident: SInvalidInput));
var
 I: Integer;
 InOutRes: Integer;
begin
 I := Low(ErrorMap);
 InOutRes := IOResult;  // resets IOResult to zero
 while (I <= High(ErrorMap)) and (ErrorMap[I].Code <> InOutRes) do Inc(I);

 if I <= High(ErrorMap) then
   Result := EInOutError.Create(ErrorMap[I].Ident) else
   Result := EInOutError.CreateResFmt(@SInOutError, [InOutRes]);
 Result.ErrorCode := InOutRes;

end;

выделенный текст - почти как в [6]



Страницы: 1 вся ветка

Текущий архив: 2004.09.12;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.045 c
3-1092742537
Эдик Дятлов
2004-08-17 15:35
2004.09.12
Как получить подключенных пользователей в базе SQL Anywhere


1-1093375510
VZup
2004-08-24 23:25
2004.09.12
Круглые SpeedButton


1-1093422135
Borion
2004-08-25 12:22
2004.09.12
Программная смена размера бумаги


14-1093328675
Ega23
2004-08-24 10:24
2004.09.12
А что с основной конфой лучилось?


1-1093529823
aliced
2004-08-26 18:17
2004.09.12
опять пропала главная панель Делфи