第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

為什么編譯器沒(méi)有檢測(cè)到這里會(huì)拋出異常?

為什么編譯器沒(méi)有檢測(cè)到這里會(huì)拋出異常?

C#
陪伴而非守候 2023-08-13 16:03:37
我試圖將異常拋出邏輯包裝到另一個(gè)類(lèi)中,以便更容易拋出自定義異常。每個(gè)類(lèi)都將使用對(duì)此 Thrower 類(lèi)的直接引用或接口,無(wú)論哪種最合適。我編寫(xiě)了一個(gè)簡(jiǎn)單的類(lèi)來(lái)處理它并且它在大多數(shù)情況下都可以工作,但是我在具有返回類(lèi)型的方法中遇到了一種情況,即使總是拋出異常,編譯器也無(wú)法檢測(cè)到它并抱怨并非所有路徑返回一個(gè)值。以下代碼顯示了 Thrower 類(lèi)和任何使用所述 Thrower 的類(lèi)的結(jié)構(gòu)的簡(jiǎn)化形式。public class Thrower{    public void ThrowException()    {        throw new Exception("Im an exception");    }}public class Foo{    // Does not work, compiler complains about not all paths returning values.    public int ExceptionNotDetected(bool shouldThrow)    {        if (!shouldThrow)        {            return 1;        }        var thrower = new Thrower();        thrower.ThrowException();    }    // Works fine.    public int ExceptionDetected(bool shouldThrow)    {        if (!shouldThrow)        {            return 1;        }        throw new Exception("Im an exception");    }}據(jù)我所知,使用 Thrower 的方法必須返回一個(gè)值或拋出異常。由此看來(lái),ExceptionNotDetected 和 ExceptionDetected 方法在功能上是等效的。那么為什么編譯器會(huì)抱怨 ExceptionNotDetected 呢?編輯:關(guān)于設(shè)計(jì),這純粹是為了說(shuō)明目的,因?yàn)槲艺嬲胱龅木褪橇私獍l(fā)生了什么。如果我沒(méi)有在帖子描述中正確澄清這一點(diǎn),我深表歉意。話(huà)雖這么說(shuō),我很欣賞有關(guān)結(jié)構(gòu)的建議。
查看完整描述

3 回答

?
慕容森

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超18個(gè)贊

編譯器只能看到當(dāng)前方法的返回類(lèi)型,“ThrowExeption()”方法什么也不返回(void)。

它不會(huì)檢查被調(diào)用方法的內(nèi)部以查看是否會(huì)返回異常。


查看完整回答
反對(duì) 回復(fù) 2023-08-13
?
一只萌萌小番薯

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ì)拋出異常。


查看完整回答
反對(duì) 回復(fù) 2023-08-13
?
搖曳的薔薇

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ě)代碼:

  1. 如果異常類(lèi)型非常具體,您應(yīng)該使用不同的異常類(lèi)型。因此,您將通過(guò)調(diào)用來(lái)拋出它throw new MyExceptionType(my_parameters);。

  2. 如果創(chuàng)建稍微復(fù)雜一些,那么您可以向類(lèi)中添加一個(gè)靜態(tài)方法來(lái)創(chuàng)建異常對(duì)象:throw new MyExceptionType::CreateFromThatData(…);

  3. 如果僅從單個(gè)類(lèi)引發(fā)異常,則該類(lèi)中可能有一個(gè)靜態(tài)函數(shù)來(lái)創(chuàng)建適當(dāng)?shù)漠惓?duì)象。這樣,您可以根據(jù)某些條件返回不同的異常類(lèi)型。所有 C# 異常都源自Exception.

  4. 如果您確實(shí)想要一個(gè)異常工廠,那么static class使用一些(靜態(tài))方法來(lái)創(chuàng)建所需的異??赡軙?huì)起作用。

  5. 在您的代碼中,我確實(shí)沒(méi)有看到創(chuàng)建對(duì)象thrower然后調(diào)用它的方法來(lái)引發(fā)異常的意義。您知道需要 2 行代碼來(lái)引發(fā)異常,而不是一行。

  6. 將調(diào)用隱藏throw在函數(shù)內(nèi)會(huì)使代碼更難以理解和驗(yàn)證。thrower.ThrowException確實(shí)拋出異常以及是哪一個(gè)異常。

  7. 正如其他答案所示,您可以首先放置引發(fā)異常的方法調(diào)用,這樣編譯器就不會(huì)報(bào)告某些部分不返回值。

您的設(shè)計(jì)和代碼過(guò)于復(fù)雜,因此產(chǎn)生的問(wèn)題比解決的問(wèn)題還要多。


查看完整回答
反對(duì) 回復(fù) 2023-08-13
  • 3 回答
  • 0 關(guān)注
  • 158 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)