2014-05-01 41 views
-1

下面的代碼應該在理想的情況下執行一個標量的SQL命令:的try-catch-最後並非所有的代碼路徑返回一個值

public object AsScalar() 
    { 
     SqlCommand cmd = CreateSqlCommand(); 
     try 
     { 

      cmd.Connection.Open(); 
      return cmd.ExecuteScalar(); 
     } 
     catch (Exception exc) 
     { 
      log.Error("Exception caught for command: "+_sql, exc); 
     } 
     finally 
     { 
      Done(cmd); 
     } 
    } 

不過,我收到以下錯誤從Visual Studio 2010:

not all code paths return a value 

我認爲在try-catch-finally中它總是會執行finally語句,不管是否有異常被捕獲,但似乎並非如此。

爲什麼添加catch子句會導致這個錯誤,當try-finally的工作沒有問題?

+1

您需要有一個默認返回子句;編譯器認識到你的'try'塊可能會失敗。除此之外,您不會返回任何值(或拋出異常)。 – 48klocs

+2

「finally」和「catch」都不會返回任何內容...... – JLRishe

回答

6

隨着catch條款,如果異常被拋出你抓住它,然後它傳播出來的方法......所以執行將得到你的try/catch月底/ finally塊,達到該方法的結束,你不會返回任何東西 - 哎呀!

當你只有有一個try/finally聲明,你要麼獲取到return聲明,一個異常會被拋出這將是傳播出來的方法 - 這兩者都是罰款。

如果你想重新拋出異常,你可以使用:

catch (Exception exc) 
{ 
    log.Error("Exception caught for command: "+_sql, exc); 
    throw; 
} 

這將解決在編譯時錯誤,因爲現在沒有得到該方法的結束方式不返回值或正在傳播的異常。然而,我通常不鼓勵「log/throw/log/throw」鏈條上升 - 它通常比更爲清晰,只有登錄到最高級別,最終捕獲異常。如果你想添加更多的上下文,你可以將它添加到現有的異常(有Exception.Data屬性,雖然它很少用於我的經驗)或包裝在另一個例外。

+0

首先,謝謝你的回答,這對你有所幫助,並且能夠更好地理解發生了什麼,所以+1。其次,從catch中返回一個空白或空對象怎麼樣? – Pseudonym

+2

@PseudoNym01可編譯,但在運行時,Jon解釋這將意味着錯誤將被吃掉,這可能會導致您的應用程序出現未知/不安全狀態。你應該正確處理sql異常,而不是假設它們可以被忽略。因此,在這裏做的最好的事情肯定會拋出異常。 – Crono

+0

我的最終目標是優雅地處理異常,不會重新拋出引發應用程序本身內可能崩潰的異常? – Pseudonym

2

catch塊,它只是簡單地記錄一條消息。它永遠不會返回任何東西或拋出異常。因此,一個可能的執行路徑是拋出異常,將被記錄,然後......沒有任何東西會被返回。實際上,finally塊將被執行,但在那裏也沒有return語句。

要解決這個問題,您可以拋出異常或在catch塊內返回null。我應該提到,通常應該首選退出。

相關問題