2015-06-19 248 views
-1

問題摘要:當發生未處理的異常時,分配給Application.OnException的方法從不運行。爲什麼Application.OnException永遠不會運行?

我創建一個空白的項目,只有本機和放在Unit.dfm一個按鈕(這是基於一個official example):

// Unit1.pas 
// ********* 

type 
TForm1 = class(TForm) 
    Button1: TButton; 
    procedure FormCreate(Sender: TObject); 
    procedure AppException(Sender: TObject; E: Exception); 
    procedure Button1Click(Sender: TObject); 
end; 

var 
Form1: TForm1; 

implementation 

{$R *.dfm} 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    Application.OnException := AppException; 
end; 

procedure TForm1.AppException(Sender: TObject; E: Exception); 
begin 
    Application.Terminate; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    raise Exception.Create('Incorrect password entered'); 
end; 

然後我設置一個斷點內TForm1.AppException()。我運行該程序,單擊按鈕,會顯示一個錯誤對話框,提示「密碼輸入錯誤」,但如果繼續執行,斷點不會中斷;該程序不像Terminate,我也問過它。程序繼續運行,我可以再次按下按鈕。

我在Delphi 7中嘗試了相同的代碼(改編),但遇到相同的結果。

+0

這裏工作得很好 –

+0

@DavidHeffernan謝謝你試試這個代碼。我有什麼想法可以調試爲什麼它不會發生在我身上? – DBedrenko

+2

您的FormCreate事件處理程序是否與表單的OnCreate事件斷開連接?請參閱對象檢查器或表單的.dfm。 –

回答

2

唯一合理的解釋是FormCreate未執行。您需要將其分配給窗體的OnCreate事件處理程序。使用對象檢查器來執行此操作。

1

如果您使用的是第三方異常處理程序(如madExcept),Application.OnException將不再觸發。您必須遵循第三方的建議。對於madExcept,您必須編寫TMadExceptionHandler.OnException事件或直接調用RegisterExceptionHandler。

相關問題