2012-08-11 52 views
2

我發現了Xcode的奇怪行爲。 在此代碼中,Xcode調試器不會中斷未捕獲的異常。如果finally塊返回,Xcode調試器無法捕獲異常

@try   { @throw @"AA"; } 
@catch (...) { @throw;  } 
@finally  { return;  } 

但是這段代碼中的異常被捕獲並觸發Xcode中斷執行以進行調試。

@try   { @throw @"AA"; } 
@catch (...) { @throw;  } 
@finally  {    } 

如果@finallyreturn小號調試器無法捕獲該異常。你見過這個問題嗎?我不確定這是一個真正的問題。從角度來看,它看起來像設計的行爲。我不知道爲什麼。 @finally塊不應該return嗎?我的問題是它無聲地吞噬異常,所以我無法檢測到它。

對我感到羞恥,我不太清楚嘗試......趕上......最後的行爲。我幾乎沒有使用異常捕獲代碼。這是設計的行爲還是錯誤行爲?這是任何已知的問題?

這是我的環境。

  • Xcode的版本4.4(4F250)
  • OS X 10.7.4

編輯

附上全測試的源代碼。

#import <Foundation/Foundation.h> 

int main (int a, char** b) 
{ 
    @try 
    { 
     NSLog(@"trying something..."); 

     @try   { @throw @"AA"; } 
     @catch (...) { @throw;  } 
     @finally  { return 0;  } 
    } 
    @catch (...) 
    { 
     NSLog(@"something catched."); 
    } 
    @finally 
    { 
     NSLog(@"finally..."); 
    } 
} 
+4

聽起來像一個潛在的錯誤,是你正在編譯的實際代碼?無論如何,Cocoa/iOS **中的異常並不旨在用於可恢復錯誤**。當Cocoa/iOS拋出異常時,一般的行爲是報告並崩潰。 – bbum 2012-08-11 15:20:26

+0

這只是測試的臨時代碼,但它是我編譯的實際代碼。 – Eonil 2012-08-11 18:20:24

回答

1

return放在@finally塊中似乎是一個壞主意。異常處理機制將試圖展開調用堆棧,因爲它處理您拋出的異常。如果@finally塊更改堆棧中的內容,則會破壞異常處理程序。這似乎並不令人驚訝地發生這種崩潰。另外,正如bbum指出的,Cocoa和Cocoa Touch中的流程控制不使用異常。通過Cocoa方法拋出異常通常會失敗。即使你正在做的事情應該在通用的Objective-C中工作,它可能仍然會導致實際代碼中的問題。

簡短回答:不要這樣做。