2011-04-27 107 views
1

雖然在Objective-C中編程,但我偶爾會有方法拋出一個我並不期待的異常。引發異常的方法

有了事後的看法,我可以看出它爲什麼會拋出異常,並且通常解決問題會導致更好的代碼。

但是,提前知道什麼方法會拋出異常以及在什麼情況下會很方便。

例如:作爲字符串包含小於42個字符

NSString *aString; 
aString = @"Less than 42 characters."; 
[aString substringToIndex:42]; 

將拋出異常。

而且這樣的:

NSString *aString = @"This is a string."; 
NSString *bString = nil; 
aString = [NSString stringByAppendingString:bString]; 

同樣會崩潰的bString爲零。

還有其他的例子嗎?

+1

不是一個愚蠢的,但幾乎:http://stackoverflow.com/questions/4310560/usage-of-nsexception-in-iphone-apps具體來說:**不要使用異常來表示任何東西,但不可恢復的錯誤** (有關詳細信息,請參閱q/a - 底線:不要使用例外來捕獲範圍錯誤) – bbum 2011-04-27 15:06:39

回答

2

但是,提前知道什麼方法會拋出異常以及在什麼情況下會很方便。

它在文檔中告訴你。

+0

+1那麼如何:文檔完成其工作。 – JeremyP 2011-04-27 14:21:17

+1

如果言外之意是,你應該依靠你的解析代碼這樣的例外,不這樣做.... – bbum 2011-04-27 15:07:59

1

雖然Objective-C的不支持的例外,他們很少使用。他們面臨的最大問題是在釋放對象之前跳出上下文所導致的內存泄漏(儘管這在GC環境中不再是問題)。

異常主要用於Objective-C中的致命情況,它們很少用於可恢復的錯誤。爲此,方法通過指針指針,如+[NSURLConnection sendSynchronousRequest:returningResponse:error:]

因此,只要文檔沒有明確說明有關異常的任何信息,就不需要太多關心它們。

你的第一個例子永遠是拋出一個異常順便說一句,作爲的NSString沒有一個方法subString:

+0

不要認爲內存泄漏不再是一個問題,如果你正在使用GC。 「malloc」和釋放的內存仍然可能泄漏,CF對象和文件描述符也可以泄漏。 – JeremyP 2011-04-27 14:28:45

+0

@JeremyP:對,忽略了。無論如何,GC是用於sissies的;-) – DarkDust 2011-04-27 14:42:18

+0

有許多其他原因不使用異常,最大的缺點是在調用過程中拋出異常是未定義的行爲。順便說一句:在許多常見情況下,Mac OS X GC實際上比非GC代碼快。更快,更小的內存佔用,更少的代碼讓我維護?是的,請。 – bbum 2011-04-27 15:05:22