2010-09-14 57 views
1

我在Objective-C中構建了一個Ruby擴展。現在我想使用@ throw/@ catch等,而不是基於宏的異常處理和自我構建錯誤處理。如何使用新的異常(@ throw ...)使用Objective-C構建Ruby擴展?

我正在使用GCC附帶的GNU運行時。
當我用我的擴展運行我的Ruby應用程序時,一旦發生異常,核心就會轉儲。中止()來自GNU Objective-C運行(libobjc/exception.c:375):

void 
objc_exception_throw (id value) 
{ 
    struct ObjcException *header = calloc (1, sizeof (*header)); 
    header->base.exception_class = __objc_exception_class; 
    header->base.exception_cleanup = __objc_exception_cleanup; 
    header->value = value; 

#ifdef SJLJ_EXCEPTIONS 
    _Unwind_SjLj_RaiseException (&header->base); 
#else 
    _Unwind_RaiseException (&header->base); 
#endif 

    /* Some sort of unwinding error. */ 
    abort(); 
} 

自從我與-fobjc-exceptions編譯我認爲_Unwind_RaiseException被調用。

有什麼辦法可以在Ruby擴展中使用Objective-C異常嗎?

回答

0

問題解決了:

的GNU Objective-C運行不處理的_Unwind_(SjLj_)RaiseException的結果(見上面的代碼)。在我的情況下,它返回5,它代表「堆棧結束」,意思是我忘記了@ try/@ catch塊。

真的應該有一些日誌記錄或一個鉤子自己做。

更新:

除非一個編譯紅寶石-fobjc-exceptions Objective-C的異常處理無法跟蹤通過Ruby代碼堆棧。因此,在對Ruby進行控制之前,您必須意識到要捕獲並打包或轉換任何Objective-C異常。