2010-03-31 60 views
7

我在Windows XP上使用Delphi Pro 6與FastMM 4.92和JEDI JVCL 3.0。鑑於下面的代碼,我遇到了以下問題:只有第一個異常處理塊獲得了E的有效實例。其他塊與正在引發的異常的類匹配正確,但E未分配(nil)。德爾福與多個異常處理塊的異常處理問題

例如,考慮到當我升高E1時E1異常處理塊的當前順序,E1匹配的塊和E是有效的對象實例。但是,如果我嘗試提高E2,則該塊確實匹配,但E未分配(零)。如果我將E2捕獲塊移動到訂購的頂部並提起E1,那麼當E1塊匹配時E is現在是未分配的。如果我提出E2,新的順序如果E2不是順序中的第一個塊,則E被正確指定。注意我用一個只包含一個Delphi格式的裸機項目來試用這個例子。

我在這裏做的事情真的很愚蠢,或者是真的不對嗎?

感謝, 羅伯特

type 
    E1 = class(EAbort) 
    end; 

    E2 = class(EAbort) 
    end; 


procedure TForm1.Button1Click(Sender: TObject); 
begin 
    try 
     raise E1.Create('hello'); 
    except 
     On E: E1 do 
     begin 
      OutputDebugString('E1'); 
     end; 

     On E: E2 do 
     begin 
      OutputDebugString('E2'); 
     end; 

     On E: Exception do 
     begin 
      OutputDebugString('E(all)'); 
     end; 
    end; // try() 
end; 
+0

我無法使用,觀察2009年德爾福的任何異常這段代碼。 – 2010-03-31 22:26:52

+0

我認爲這個問題只發生,因爲你實際上並沒有在塊內使用E.由於編譯器優化,此變量在不使用時不穩定。 如果你想,但在類似OutputDebugString('E1'+ E.Message)它應該工作。 – 2013-09-03 09:08:38

回答

8

如果我是正確的,你所看到的行爲是見證下調試評估Ë時(這個我獲得了類似的行爲在2006年BDS調試測試這個)。

這是調試器中的符號解析錯誤,但似乎不會影響運行時行爲。

如果調試行爲是很重要的,只需重命名你的異常處理程序變量,以便調試器不具有任何(潛在的)模糊方法必須解決:

On E1: E1 do 
begin 
    OutputDebugString('E1'); 
end; 

On E2: E2 do 
begin 
    OutputDebugString('E2'); 
end; 

On Ex: Exception do 
begin 
    OutputDebugString('E(all)'); 
end; 
+0

謝謝Deltics。我不知道那個。這就像Stream.size屬性,它導致我始終將該屬性分配給代碼中的變量,以便在調試期間可以看到該值,因爲調試器始終返回零。 – 2010-04-01 00:39:29