2011-06-14 106 views
-5

請告訴我什麼是錯這個C#代碼..這個C#代碼有什麼問題?

public bool CloseCOMPort() 
    { 
     try 
     { 
      bool isClosed = false; 
      if (oSerialPortMisc != null && oSerialPortMisc.IsOpen) 
      { 
       oSerialPortMisc.Close(); 
       isClosed=true; 

      } 
      else 
      { 
       isClosed = false; 

      } 
      return isClosed; 
     } 
     catch (Exception exp) 
     { 

     } 
    } 

當我編譯此代碼提示錯誤。「並非所有的代碼路徑返回一個值」。 我不知道這裏錯了。 PLease help .. Thanxxx ... :)

+2

你會得到什麼錯誤信息?你想做什麼? – TJHeuvel 2011-06-14 11:58:28

+3

也許你可以評估你想在其中找到什麼錯誤的部分? – ub1k 2011-06-14 11:58:48

+2

您收到哪些錯誤?是否有任何異常被拋出?有沒有不是你所期望的行爲?你是否試圖同時使用這段代碼?在我懷疑的這種情況下,一些更多的信息將有助於提供更明確的答案。 – 2011-06-14 11:59:32

回答

1

更具體。如果該方法不是void,則代碼中的每個叉必須返回適當的值或拋出。在你的情況下,catch fork沒有執行上述任何操作,並且你的代碼不能編譯。

8

該方法並不總是返回一個值。 你的編譯器應該告訴你同樣的事情。

值(isClosed)僅在try { .. }塊中返回。現在,想象一下,如果在返回語句之前失敗(拋出異常),代碼將繼續在catch { .. }中返回任何內容,這就是爲什麼代碼無法編譯的原因。

您應該在方法的底部放置一個return聲明。

定義isClosed位於方法的頂部,並將其返回到底部,無論如何。

public bool CloseCOMPort() 
{ 
    bool isClosed = false; 

    try { .. } 
    catch { .. } 

    return isClosed; 
} 
+0

爲了澄清,如果代碼進入catch塊,它不會返回任何東西。 – TJHeuvel 2011-06-14 11:59:35

+0

@TJHeuvel:我已經更新了我的答案。 – Kevin 2011-06-14 12:00:07

+0

@himanshu:它沒有早點說:)。無論如何,我解釋瞭如果你的代碼進入'catch'塊會發生什麼。 – Kevin 2011-06-14 12:03:38

3

在catch中沒有return語句。

試試這個:

public bool CloseCOMPort() 
    { 
     try 
     { 
      bool isClosed = false; 
      if (oSerialPortMisc != null && oSerialPortMisc.IsOpen) 
      { 
       oSerialPortMisc.Close(); 
       isClosed=true; 

      } 
      else 
      { 
       isClosed = false; 

      } 
      return isClosed; 
     } 
     catch (Exception exp) 
     { 
     return false; 
     } 
    } 
+0

謝謝Jeff,TJHeuvel :) – himanshu 2011-06-14 12:11:02

4

你的方法必須指定在任何情況下返回值。 嘗試:

public bool CloseCOMPort() 
{ 
    bool isClosed = false; 

    try 
    { 
     if (oSerialPortMisc != null && oSerialPortMisc.IsOpen) 
     { 
      oSerialPortMisc.Close(); 
      isClosed=true; 
     } 
     else 
     { 
      isClosed = false; 
     } 
    } 
    catch (Exception exp) 
    { 
    } 

    return isClosed; 
} 
0

ü必須始終返回布爾試試這個:

public bool CloseCOMPort() 
{ 
    bool isClosed = false; 
    try 
    { 

     if (oSerialPortMisc != null && oSerialPortMisc.IsOpen) 
     { 
      oSerialPortMisc.Close(); 
      isClosed=true; 

     } 
    } 
    catch (Exception exp) 
    { 

    } 

    return isClosed; 
} 
+0

不一定。他可以拋棄這個漏洞,代碼仍然很好。檢查我的答案。 – 2011-06-14 12:00:53

0

如果發生預期情況,您可能會進入try/catch區塊。

這將意味着yoru函數永遠不會返回一個值。 C#編譯器足夠聰明地發現這一點。

4

如果發生異常,則該方法不會返回值。

移動的isClosed聲明的try塊外,並添加:

finally 
{ 
    return isClosed; 
} 

您還可以簡化您的代碼:

public bool CloseCOMPort() 
{ 
    bool isClosed = false; 
    try 
    { 
     if (oSerialPortMisc != null && oSerialPortMisc.IsOpen) 
     { 
      oSerialPortMisc.Close(); 
      isClosed = true; 
     } 
    } 
    catch (Exception exp) 
    { 
     // Add some logging of the exception here 
    } 
    finally 
    { 
     return isClosed; 
    } 
} 

這也是不好的做法catch基本Exception。您應該只捕獲您調用的方法拋出的異常。

使用finally塊可確保即使您決定重新拋出您陷入的任何異常或決定不捕獲異常,也能執行該代碼。

+0

+1:在所有答案中,這是唯一一個以某種方式實際處理捕獲到的異常的人。 (即使這只是一條建議OP處理它的評論,我在問題中注意到的第一件事情不是'catch'中沒有返回,而是'catch'中缺少_anything_。 – David 2011-06-14 12:16:01

0

您在try塊內返回isClosed,並且不在catch塊中返回任何內容。所以,如果發生任何異常,你的函數將不會返回任何東西。

建議:您可以在catch塊上返回false