3 回答

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超18個(gè)贊
編譯器只能看到當(dāng)前方法的返回類(lèi)型,“ThrowExeption()”方法什么也不返回(void)。
它不會(huì)檢查被調(diào)用方法的內(nèi)部以查看是否會(huì)返回異常。

TA貢獻(xiàn)1795條經(jīng)驗(yàn) 獲得超7個(gè)贊
由于 C# 不像 Java 那樣具有檢查異常,因此編譯器無(wú)法知道拋出者實(shí)際上拋出了異常。
但你可以顛倒邏輯
if (shouldThrow)
{
var thrower = new Thrower();
thrower.ThrowException();
}
return 1;
這樣,編譯器將假設(shè)返回 1,并且 ThrowException 方法是一個(gè)常規(guī) void,它像任何其他 void 方法一樣可能會(huì)拋出異常。

TA貢獻(xiàn)1793條經(jīng)驗(yàn) 獲得超6個(gè)贊
很簡(jiǎn)單,因?yàn)榫幾g器不會(huì)分析函數(shù)內(nèi)部的代碼來(lái)檢測(cè)該函數(shù)是否總是拋出異常。
C# 似乎沒(méi)有“永不返回”的屬性。
而且,沒(méi)有理由這樣編寫(xiě)代碼:
如果異常類(lèi)型非常具體,您應(yīng)該使用不同的異常類(lèi)型。因此,您將通過(guò)調(diào)用來(lái)拋出它
throw new MyExceptionType(my_parameters);
。如果創(chuàng)建稍微復(fù)雜一些,那么您可以向類(lèi)中添加一個(gè)靜態(tài)方法來(lái)創(chuàng)建異常對(duì)象:
throw new MyExceptionType::CreateFromThatData(…);
如果僅從單個(gè)類(lèi)引發(fā)異常,則該類(lèi)中可能有一個(gè)靜態(tài)函數(shù)來(lái)創(chuàng)建適當(dāng)?shù)漠惓?duì)象。這樣,您可以根據(jù)某些條件返回不同的異常類(lèi)型。所有 C# 異常都源自
Exception
.如果您確實(shí)想要一個(gè)異常工廠,那么
static class
使用一些(靜態(tài))方法來(lái)創(chuàng)建所需的異??赡軙?huì)起作用。在您的代碼中,我確實(shí)沒(méi)有看到創(chuàng)建對(duì)象
thrower
然后調(diào)用它的方法來(lái)引發(fā)異常的意義。您知道需要 2 行代碼來(lái)引發(fā)異常,而不是一行。將調(diào)用隱藏
throw
在函數(shù)內(nèi)會(huì)使代碼更難以理解和驗(yàn)證。thrower.ThrowException
確實(shí)拋出異常以及是哪一個(gè)異常。正如其他答案所示,您可以首先放置引發(fā)異常的方法調(diào)用,這樣編譯器就不會(huì)報(bào)告某些部分不返回值。
您的設(shè)計(jì)和代碼過(guò)于復(fù)雜,因此產(chǎn)生的問(wèn)題比解決的問(wèn)題還要多。
- 3 回答
- 0 關(guān)注
- 158 瀏覽
添加回答
舉報(bào)