Ica*_*aro 0 delphi exception-handling try-catch delphi-xe
我在Delphi XE中遇到这个有趣的问题,我在其中创建了一个try/except/finally语句,当应用程序生成异常时,except块从不被调用,它直接跳转到finally块,我尝试了一些事情,比如反转try /除了/最后尝试/ finally/except,尝试将try块更改为不同的地方,清理代码并重新编译,以防Delphi问题,但注意似乎工作.
我在这里要完成的是向用户显示一条对话框消息,并在发生崩溃后清理代码.
procedure CallbackExport(Sender: TObject);
var
SaveDlg: TSaveDialog;
FileName: string;
begin
SaveDlg := TSaveDialog.Create (nil);
try
try
SaveDlg.Title := 'Export';
SaveDlg.InitialDir := GetSystemPath(CSIDL_DESKTOP);
SaveDlg.Options := [ofOverwritePrompt, ofEnableSizing];
case (Sender as TMenuItem).Tag of
cnExcel: begin
SaveDlg.Filter := 'Excel File (*.xls)|*.xls';
end;
cnHtml: begin
SaveDlg.Filter := 'HTML File (*.html)|*.html';
end;
cnTxt: begin
SaveDlg.Filter := 'Text File (*.txt)|*.txt';
end;
cnCsv: begin
SaveDlg.Filter := 'Comma Seperated File (*.csv)';
end;
cnXml: begin
SaveDlg.Filter := 'XML file (*.xml)|*.xml';
end;
end;
if not SaveDlg.Execute(self.Handle) then
Exit;
FileName := SaveDlg.FileName;
case (Sender as TMenuItem).Tag of
cnExcel: begin
ExportGridToExcel(FileName, tvdGrid);
end;
cnHtml: begin
ExportGridToHTML(FileName, tvdGrid);
end;
cnTxt: begin
ExportGridToText(FileName, tvdGrid);
end;
cnCsv: begin
ExportGridToText(FileName, tvdGrid, true, true, ',', '', '', 'CSV');
end;
cnXml: begin
ExportGridToXML(FileName, tvdGrid);
end;
end;
except
on e: exception do
begin
ShowMessage('An error occurred while saving the file ' + FileName + #13#10 + 'With a message: ' + E.Message);
StvdAudit.tvdAudit('Error saving file, reason: ' + E.Message);
end;
end;
finally
SaveDlg.Free;
end;
end
Run Code Online (Sandbox Code Playgroud)
如果在try/except中引发异常,并且没有被调用堆栈中的代码处理,则它将被异常处理程序捕获.
您声称ExportGridToXXX正在引发一个未被代码中的异常处理程序捕获的异常.但这种说法不可能是真的.要么没有引发异常,要么ExportGridToXXX已经处理异常.
关于异常处理的更一般主题,一般政策应该是尽可能不处理它们.您应该只在需要停止异常传播的情况下处理它们,并且需要在代码中此处处理异常.通常,特别是在UI程序中,您只需让顶级异常处理程序处理异常即可.
除此之外,您还可以编码吞下所有异常,无论其类型如何.这是不好的做法.假设您确实希望处理引发ExportGridToXXX的异常,则应该只处理预期的异常类.例如,您可能会遇到EAccessViolation应用程序的策略要终止的策略.但是,由于您吞下它,在用于捕获共享冲突的相同处理程序中处理它,您无法应用该策略.在处理异常时始终要清楚.
| 归档时间: |
|
| 查看次数: |
2884 次 |
| 最近记录: |