Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.09 c
1-1093626070
Lord de Mon
2004-08-27 21:01
2004.09.12
Как после клика на пункте меню открыть определённую страницу в бр


1-1093228404
Poluprovodnik
2004-08-23 06:33
2004.09.12
ListBox


4-1090998661
TUser
2004-07-28 11:11
2004.09.12
GetWindowPlacement


3-1092811124
Belkova
2004-08-18 10:38
2004.09.12
Delphi и 1С


1-1093919119
race1
2004-08-31 06:25
2004.09.12
TLabel





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский