【发布时间】:2014-05-04 03:18:37
【问题描述】:
我在使用 Delphi XE 时遇到了一个有趣的问题,我在其中创建了一个 try/except/finally 语句,当应用程序生成异常时,从不调用 except 块直接跳转到 finally 块,我尝试了一些类似 invert 的方法将 try/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
【问题讨论】:
-
这段代码看起来应该可以工作。您能否提供一个我们可以实际编译和测试的可重现示例?
-
您如何知道正在生成异常?尝试显式地引发异常,看看会发生什么。放“引发异常。创建('这是一个异常');”第二次尝试后。
-
我同意。如图所示,这段代码中很少会引发异常。
-
我的猜测是 ExportGrid 函数可能正在处理/处理异常(try..except 在其中)。由于对这些函数的调用是 try..finally 块中的最后一个可执行行,因此它会在跳转到 finally 语句时出现。为了确认这一点,您可以在您的 except 子句之前添加一个 ShowMessage 并查看在 IDE 向您显示异常后是否收到该消息。如果是这种情况,您将不必处理该函数内部的异常或在 except 块上重新引发它(只是
raise;)。不知道有没有说清楚…… -
我从未使用过 DevExpress,所以我无法断言任何东西,但我仍然猜测
ExportGrid函数正在处理异常。我建议您设置一个断点并一直深入到 DevExpress 源代码(函数上的 [F7])中,以跟踪异常发生的位置以及处理的位置。您应该有源代码,但可能不在库路径中(这样可以避免重新编译,从而节省时间)。但是当调试器请求 .pas 文件时,找到它并在调试器上选择(通常组件在其树中带有source目录)。
标签: delphi exception-handling try-catch delphi-xe