Два очень простых вопроса об обработке исключений в Delphi.
1) Когда Try
? Я предполагаю, что мне не нужно предложение Try
вокруг
- простой код, такой как присваивания, условные операторы и циклы
- доступ к моим компонентам VCL
но мне нужно Try
- доступ к базе данных
- любые сторонние компоненты, так как я не знаю, могут ли они вызвать исключение или нет
- все, что показывает справочная система, может вызвать исключение
Я что-то пропустил?
2) Попробовать... Наконец или Попробовать... Кроме... или и то, и другое? В течение многих лет я думал, что это выбор «или/или», пока @RRUZ не ответил один из моих вопросов с некоторым кодом, который
try
CoInitialize(nil);
try
SetStaticIpAddress('Network card name','192.168.1.1','255.255.255.0');
finally
CoUninitialize;
end;
except
on E:EOleException do
Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode]));
on E:Exception do
Writeln(E.Classname, ':', E.Message);
end;
Вопрос: за исключением того, что исключения будут перехватываться только из CoInitialize(nil);
или также из SetStaticIpAddress('Network card name','192.168.1.1','255.255.255.0');
?
Иными словами, возможно ли получить свой пирог и съесть его, если в конце концов удастся превзойти попытку за исключением попытки?
[обновить] ответ на № 2, кажется, да. Этот код показывает оба диалоговых окна...
procedure TForm3.FormCreate(Sender: TObject);
var x, zero : Integer;
begin
zero := 0;
try
try
x := 42 div zero;
finally
MessageDlg('Divide by zero finally', mtInformation, [mbOK], 0);
end;
Except
on E: Exception do
MessageDlg('Divide by zero exception handled', mtInformation, [mbOK], 0);
end;
end;
try/except
. Обычно это означает, что что-то пошло не так, и никакие обработки не могут исправить эту ошибку. Исключения, ну, исключительные. Пусть исключения всплывают на верхний уровень. Теперьtry/finally
используется для защиты ресурсов. Например, вы выделяете память, а затем должны убедиться, что она впоследствии будет освобождена, несмотря ни на что. Этоfinally
. - person David Heffernan   schedule 26.09.2012finally
обеспечивает освобождение ресурсов как для успеха, так и для неудачи, тогда какexcept
позволяет мне регистрировать информацию или, возможно, информировать пользователя и выполнять общую обработку ошибок. - person Mawg says reinstate Monica   schedule 26.09.2012