3 回答

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

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