2016-05-29 5 views
1

Я использую Mkdir от Free Pascal System.Как вы определяете, какое исключение выбрано MkDir?

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

Я хотел бы поймать это СПЕЦИФИЧЕСКОЕ исключение, как бы там ни называлось. Тем не менее, я не знаю, как найти точное название возбужденного исключения.

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

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

В моем тестировании просто добавление раздела try/except/end останавливает отмену стандартной программы ошибок времени выполнения (с сообщением в stdout). Вместо этого поток программы переходит к блоку «except..end» и продолжается после этого. Однако без использования блока SysUtils вы не можете определить, какое исключение было создано, поскольку классы исключений определены там.

ответ

2

Системный блок имеет рудиментарную процедуру «terminate with errorcode» под названием 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 
+0

Спасибо за ответ. Оглядываясь на документацию для MkDir, он говорит «ошибка времени выполнения» и не упоминает об исключении. Однако, если я помещаю вызов MkDir в блок try/except и просто записываю WriteLn в другой части, я вижу, что это сообщение напечатано, даже без SysUtils в программе. Пробовать/исключать блоки также обрабатывать ошибки времени выполнения? – Scooter

+1

Нет, но sysutils перехватывает процедуру ошибки времени выполнения и повышает их как исключение. –

+0

Мой код переходит в раздел «except» на сбой MkDir, даже если в программе не используется «Uses SysUtils». Возможно, SysUtils автоматически включается как System. – Scooter