Форум: "Потрепаться";
Текущий архив: 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.033 c