Как вы определяете исключение, создаваемое MkDir?


Я использую Mkdir из блока Free Pascal System.

Если каталог уже существует с тем же именем, которое передается этой процедуре, возникает ошибка. С директивой компилятора $IOCHECKS, установленной в {$I -}, программа продолжается, но IOResult имеет код ошибки 5. Без директивы компилятора {$I -} создается исключение. Если он не пойман, программа завершает работу с кодом возврата 5, отражающим ошибку.

Я бы хотел ... поймайте это конкретное исключение, как бы оно ни называлось. Однако я не знаю, как найти точное имя вызванного исключения.

Примечание: я принял данный ответ, но есть одно утверждение, с которым я не согласен:

Преобразование ошибки времени выполнения в исключение является особенностью sysutils.

В моем тестировании, просто добавив try / except / end раздел останавливает стандартный runtime error program abort (с сообщением в stdout). Вместо этого поток программы направляется в "кроме..конец " блока и продолжается после этого. Однако без использования блока SysUtils вы не можете определить, какое исключение было вызвано, так как классы исключений определены там.

1 2

1 ответ:

Системный блок имеет рудиментарную процедуру "завершить с кодом ошибки", называемую runerror, что вы и видите. И это не исключение. Это выглядит так:

[D:\testing]blaat
Runtime error 5 at $00401437
  $00401437
  $00406E91

Кроме предотвращения его с помощью метода ioresult это не подлежит восстановлению

Преобразование ошибки времени выполнения в исключение является особенностью sysutils. Если вы уже используете sysutils, то поднимите EInOutError и посмотрите так:

[D:\testing]blaat
 An unhandled exception occurred at $00401557:
 EInOutError: Access denied
 $00401557