2013-01-14 108 views
6

我有以下代碼:在方法中拋出異常會導致方法返回嗎?

public static Point operator /(Point point, double value) 
    { 
     if (value == 0) 
     { 
      throw new DivideByZeroException("Cannot divide by zero"); 
      return Point.Origin; 
     } 
     return new Point(point.X/value, point.Y/value, point.Z/value); 
    } 

而且第一return語句(return Point.Origin;)突出綠色在Visual Studio。當光標懸停在帶下劃線的文本上時,消息顯示「檢測到無法訪問的代碼」。這導致我在標題行中指出我的問題:

在方法中拋出異常會導致方法返回嗎?

+1

謝謝,我明白了現在:在方法中拋出異常會導致程序要麼去的方法中形成適當的異常處理程序的執行流程,(如catch或finally語句),如果有的話,或退出的方法和上浮調用堆棧直到它被處理。在任何情況下,'throw new Exception'之後的方法中的其他代碼以及任何catch/finally塊之外的代碼將永遠不會執行。爲了澄清和回答問題,該方法不返回值,但是它在程序執行返回到調用方法的意義上「返回」。 –

回答

1

在方法中拋出異常會導致方法返回嗎?

是的。方法的執行正在中斷,所以方法返回它的執行流程。但是沒有返回任何值,您使用return聲明來定義它。當前方法中的throw new之後沒有行,除了對應的catchfinally塊之外。所以你不必在拋出異常之後返回值。

Visual Studio強調它檢測到的代碼塊無法到達。在您的具體情況下,return Point.Origin;聲明永遠不會執行,因此您可以將其刪除。

+0

它真的是一種「回報」般的行爲嗎?因爲技術上這個函數不會返回一個值,但它表示一個異常。我錯了嗎? – cheesemacfly

+0

你是對的。我們講的是執行流程的返回,而不是返回的值。因爲返回的方法可以被看作是返回執行流的原因或者返回值的原因:如果爲true,則返回false。 –

+0

@cheesemacfly - 一個異常_aborts_方法,使得返回值不成問題。 –

0

是的,拋出一個異常導致該方法立即返回。

但是,這不是正常的回報。例如,沒有返回值。捕獲由於引發異常而返回的方法的控制權的唯一方法是擁有一個異常處理程序。

8

那麼,它會導致方法執行到退出,是的。拋出堆棧的異常,到最接近它的方法。如果它不影響執行流程,那將是毫無意義的。

這與返回「正常」的方法不同 - 即沒有例外。因此,假設調用方法有:

Point foo = bar/baz; 
Console.WriteLine("Done"); 

在這種情況下,Console.WriteLine()呼叫如果除法運算符拋出異常不會執行。相反,要麼的例外是在該方法中捕獲,異常將傳播到方法的調用者等

finally塊將沿途也被執行。)

這可能值得讀取"handling and throwing exceptions"的MSDN指南。

1

不完全。當引發異常時,如果被捕獲,它將跳轉到方法內的處理代碼。從那裏可以做任何你想做的事。如果在您的示例中未被捕獲,它將跳轉到調用此方法的方法,並且永遠不會「返回」一個值。它也永遠不會返回執行拋出的異常後返回的行。

2

不,因爲拋出異常是不是一個返回。

如果異常沒有在函數內部處理,這將導致立即將退出功能,通過控制第一點在異常會被逮住即處理程序。 (在節目中突然去世而產生的,如果它沒有得到處理。)

由於函數拋出return語句是沒用,因爲它永遠不會被達到。之後將退出,