2012-04-17 115 views
2

我有一個類「b」從類「a」繼承。在類「a」中,有一些代碼在事件不爲null時執行操作。我需要該代碼在應用程序的特定時間在類「b」中觸發。所以在'b'我訂閱了一個新的Handler(事件)。什麼是「throw new NotImplementedException();」做到了嗎?

如果我離開自動生成的事件「是」類「B」與throw new NotImplementedException();線,代碼工作/運行正常。只要我刪除thow異常,應用程序不再按預期工作。

那麼,什麼是throw new NotImplementedException除了拋出異常幹什麼?

我意識到我可能想在這一點上解決我的編碼問題走錯了路,我相信我會找到更好的方法來做到這一點(我還在學習),但仍然是我的問題。爲什麼該行改變了代碼的結果?

編輯: 我reallize我wan't非常具體的用我的代碼。不幸的是,由於嚴格的政策,我不能。我在課堂'a'中有一個if語句。

if (someEvent != null) 

當代碼'工作'時,if語句返回true。當它沒有按預期工作時,它返回'假'。在'b'類中,應用程序'唯一的工作'(或者if語句返回true)是當我在附加新事件時自動生成的類'b的事件方法中的throw new NotImplementedException();行。

+6

這是我第一次注意到有人問爲什麼**移除**異常會導致不需要的行爲;) – 2012-04-17 14:37:29

+0

「不再按預期工作」:您期望什麼,取而代之的是什麼? – phoog 2012-04-17 14:47:35

+2

這聽起來像是有史以來最令人沮喪的項目經理......「蒂姆,你完成了沒有實現該功能嗎?」 – 2012-04-17 15:28:52

回答

3

這僅僅是一個例外,至於爲什麼它意味着您的應用程序「工作」完全依賴於處理任何異常的代碼。

與正常例外情況不同,它不是「特殊」例外情況(除了像其他情況一樣從Exception派生出來)。您傾向於將代碼生成視爲一個佔位符來實現它所投入的成員。要做到這一點要比代碼生成嘗試理解成員結構以輸出編譯代碼要容易得多。

當你說「不再按預期工作」,我假設它編譯。如果刪除代碼不會編譯代碼,那麼機會就會很好,您將得到一個關於返回值的編譯錯誤。

也許觸發事件的代碼需要處理程序的特定響應,或者如果沒有處理程序或發生異常,它會默認響應並繼續。在你的情況,有一個處理程序,並沒有例外,所以它期望更好的迴應?

完整的猜測。

如果在a代碼,你需要在b使用,考慮做,如果你需要override的行爲,裏面的代碼protected和可選virtual方法。

+0

關於返回值的好處 - 這種可能性沒有發生在我身上 - 但在這裏我們正在討論一個事件處理程序,這將是一個「空白」方法。 – phoog 2012-04-17 14:41:47

+1

@phoog真的,但代替任何實際的事實/代碼顯示的問題,我可以猜得像一個像;-) – 2012-04-17 14:42:27

6

想一想:如果你想添加兩個整數以下方法...

private int Add(int x, int y) 
{ 

} 

...並沒有代碼裏面做這樣的(方法甚至不返回整數)。這是NotImplementedException的用途。

+1

真棒的例子... :) – saun4frsh 2014-02-27 14:59:23

2

NotImplementedException是一種聲明interface或基礎class的特定方法在您的類型中沒有實現的方法。這是E_NOTIMPL錯誤代碼的例外形式。

一般來說,一個實現不應該拋出一個NotImplementedException,除非它是該特定的interface特別支持的方案。在絕大多數情況下,情況並非如此,類型應完全實施interfaces

雖然它在做什麼。它只是拋出一個異常。很難說爲什麼程序在面對異常時保持功能,除非你給我們提供更多信息,否則就會失效。

+0

對於一個對象,實現一個接口,但不提供給定接口成員的行爲是不是更通常的拋出'NotSupportedException'? – phoog 2012-04-17 14:46:27

+0

@phoog'NotSupportedException'通常保留給接口有一個屬性,指定接口上的方法是否有效。例如,如果'ICollection .IsReadOnly'爲true,則'ICollection .Add'應該拋出'NotSupportedException'。 'NotImplementedException'只適用於方法未實現的情況。寫一篇關於差異文章的博客文章http://blogs.msdn.com/b/jaredpar/archive/2008/12/12/notimplementedexception-vs-notsupportedexception.aspx – JaredPar 2012-04-17 14:49:12

0

NotImplementedException僅僅是一個例外,當你要做的事情的代碼還沒有寫出來的時候就會使用這個例外。它通常用在代碼片段中作爲佔位符,直到您填充使用實際代碼生成的任何內容爲止。

使用NotImplementedException而不是空白代碼塊是一種很好的做法,因爲它會非常明顯地發出錯誤提醒您代碼段尚未完成。如果它是空白的,那麼這個方法可能會運行並且什麼也不會發生,這有時候會很麻煩。

相關問題