2012-10-26 19 views
2

我期待開始把錯誤捕捉到我的代碼,我想看看有什麼NSError對象爲我自己做什麼,我不得不對自己添加。在this SO questionthe Apple DocsNSError自己做什麼,如果有的話?

看,它看起來像所有NSError確實是守住一個數字錯誤代碼,錯誤的地點和錯誤的描述。對於所有這三個項目,我必須在我的代碼中指定它們。然後,如果我想要執行某些操作,例如跳到當前正在執行的任何方法的末尾(如果應用程序試圖運行它們,最有可能導致崩潰),或者顯示一條告訴用戶出現錯誤的提示,我有也要自己指定所有這些,對嗎?

我有點初學者的,所以有什麼事我會想考慮這樣做?

+0

爲了澄清,我知道如何在需要時通過顯示警報和編寫gotos。我主要試圖驗證是否由我來做這些事情。例如,我不想編寫自己的代碼來顯示警報,如果有一個非null的錯誤對象會自動創建警報,並讓我的用戶使用雙警報進行排序。 – GeneralMike

回答

3

NSError是錯誤信息的容器,它不做自己的事情。該類的設計使得代碼的不同部分可以以標準方式將錯誤信息彼此通信。簡單的設置是需要NSError**的方法內的誤差不執行任何操作 - 這是調用者的責任,以檢查是否*error是非nil,跳到方法的末尾,顯示本地化說明,提示用戶操作,等等。

然而,NSError具有足夠的靈活性,使您能夠做的一切:調用者可以提供幾乎任何類型的信息;您可以跟蹤恢復嘗試,向用戶顯示本地化的消息,或將附加信息存儲在NSError對象中,並將其返回到呼叫鏈的更遠處。

注意:Cocoa框架方法通常要求您在使用NSError之前檢查直接返回值,而不是檢查錯誤是否爲nil。如果該方法指示失敗,則該錯誤將保證有效,但即使您事先將其設置爲nil,也不能保證成功爲nil

+0

謝謝,第一句與我正在尋找的完全一致 - 將其稱爲「信息容器」是放置它的好方法。在帖子的其他部分也有很多其他的好消息。 – GeneralMike

+0

可可框架方法通常要求你在使用'NSError'前檢查直接返回值,而不是檢查錯誤是否爲'nil'。如果該方法指示失敗,則該錯誤將保證有效,但即使您事先將其設置爲「nil」,也不能保證成功爲「零」。 –

+0

@JoshCaswell多麼好的評論!我逐字將其複製到答案中。非常感謝你! – dasblinkenlight

1

提供NSError作爲錯誤封裝。這是一個很好的面向對象的實踐,它允許其他簽名強烈地反對它。這很像Java和C#中的Exception類。它還允許你創建一個指針,傳遞給一個方法,該方法將NSError作爲參數,在方法結束後,你可以檢查NSError是否可以處理你的應用程序可以處理的條件。

+0

啊,所以它主要是作爲明確處理錯誤的標準化對象。我對Java或C#不太熟悉,但我知道我的公司有很多舊的Fortran代碼,它們會有類似'integer errorNumber = 0'的東西,並通過調用傳遞給它,並在某些情況下將其設置爲非零發生。然後有一個大的選擇案例塊,它將顯示一個相關的消息,這取決於數字是什麼。所以NSError幾乎是將所有信息轉換爲1包的方式,而不是必須在一堆單獨的部分中處理它。 – GeneralMike

+0

是的,先生,這是主要的用法。想象一下,如果你必須分別傳遞錯誤代碼,消息,描述和堆棧跟蹤。這只是一個簡單的封裝機制。希望能爲你解決它。 – chrislhardin

+0

是的,非常感謝! – GeneralMike

1

你可能要考慮張貼一些代碼來幫助說明您要完成的任務。

有一兩件事你可以做的是,調用將填充錯誤對象,檢查錯誤不是零,或評估錯誤對象的屬性的方法之後。

它可能看起來像:

-(void)someMethod { 
    NSError *error; 

    [self myMethod:&error]; 

    if (error) { 
     // handle the error, display an alert, etc ... 
    } 
    else { 
     // do other stuff when no error occurs 
    } 
} 
+0

我並沒有太多問「我該如何編碼」,更像是「我需要編碼,還是編碼給我」。事後看來,我可能應該包含一些代碼,以防有人在以後發現該代碼**正在尋找代碼,但您在這裏的內容幾乎就是我的想法。我在我的問題中添加了一條評論,以澄清我所問的內容。 – GeneralMike

相關問題