Как вы определяете исключение, создаваемое MkDir?
Я использую Mkdir из блока Free Pascal System.
Если каталог уже существует с тем же именем, которое передается этой процедуре, возникает ошибка. С директивой компилятора $IOCHECKS, установленной в {$I -}, программа продолжается, но IOResult имеет код ошибки 5. Без директивы компилятора {$I -} создается исключение. Если он не пойман, программа завершает работу с кодом возврата 5, отражающим ошибку.
Я бы хотел ... поймайте это конкретное исключение, как бы оно ни называлось. Однако я не знаю, как найти точное имя вызванного исключения.
Примечание: я принял данный ответ, но есть одно утверждение, с которым я не согласен:Преобразование ошибки времени выполнения в исключение является особенностью sysutils.
В моем тестировании, просто добавив try / except / end раздел останавливает стандартный runtime error program abort (с сообщением в stdout). Вместо этого поток программы направляется в "кроме..конец " блока и продолжается после этого. Однако без использования блока SysUtils вы не можете определить, какое исключение было вызвано, так как классы исключений определены там.
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