2012-11-25 79 views
1

我試圖在catch方法中編寫一個if-else塊,但是當我得到'不是所有代碼路徑都返回類型爲int的錯誤'。c#if-else在catch語句中

本質上,我正在寫一個方法將用戶名和密碼保存到Sql CE數據庫,並且我想測試一個特定的錯誤。 (UserName已存在。)UserName列是唯一的,所以它會可靠地拋出一個帶有NativeError = 25016的SqlCeException異常。我想用錯誤消息顯示它,否則以更通用的方式處理其他異常。

我的代碼是:

try 
    { 
    //insert command (This is where the duplicate column error is thrown) 
    //Select @@Identity & Return it 
    } 
    catch (SqlCeException ex) 
    { 
    if (ex.NativeError == 25016) 
     MessageBox.Show("Username already in use."); 
    else 
    //whatever 
    } 

我試圖呈現出不同的,更通用的消息,並得到了不歸路錯誤。 我試着拋出一個新的異常並將它捕獲到另一個塊中。同樣的錯誤。 我試過返回-1(作爲一種標誌值)。同樣的錯誤。

在這個特定情況下,似乎沒有比SqlCeException更具體的錯誤(儘管我可能只是失敗了我的調試功能)。

任何創造性的變通? 最壞的情況下,我會寫一個方法,在調用此方法之前檢查數據庫是否有重複的用戶名。

+2

您提到的錯誤消息是關於函數的返回值,並且沒有顯示在您共享的代碼中。 – SAJ14SAJ

+0

插入後,我選擇插入的表的@@標識,然後返回。 我發現關閉這個錯誤的唯一辦法是把「throw ex;」在catch塊中沒有別的東西。 我只是一名學生,並不擅長Try-Catch。有任何想法嗎? –

+0

已經回答的其他人已經獲得了它的核心 - 即使在調用catch-clause時也需要返回值。 – SAJ14SAJ

回答

6

它看起來像你的方法返回一個int。你需要從你的catch塊中返回一個int類型的值。

try 
    { 
    //insert command (This is where the duplicate column error is thrown) 
    //Select @@Identity & Return it 
    } 
    catch (SqlCeException ex) 
    { 
    if (ex.NativeError == 25016) 
     MessageBox.Show("Username already in use."); 
    else 
    { 
    //whatever 
    } 
    return -1; 
    } 
+0

+1。 (編輯答案在其他地方添加大括號 - 同時節省2個字節的源代碼非常重要,註釋不被視爲語句 - 所以返回僅在其他部分)。 –

+0

@AlexeiLevenkov - 感謝讓它更清晰。我假設讀者會明白'//任何'代表'else'塊。更好的錯誤無誤。 –

+0

是的,我做了這一個,除了我在if塊後面放回-1,但是在catch裏面。我想我以某種方式誤解了這個問題。 我知道這是一種糟糕的形式,但是有人會介意幾次提問嗎?我缺乏積極點來鼓勵那些有幫助的人。我只需要15. –

2

聽起來像你的函數返回一個int值。

在你的try塊中,你得到並返回一個整數值。沒關係。

catch塊你沒有提到返回一個整數。這就是問題。

因此,當函數接受異常路徑時,它沒有一個返回的整數來導致錯誤。

0

您的整個功能需要返回值。由於您在try-cathc中吃了異常,您需要在函數結束時返回某種類型。

0

使用finally塊來INT返回:

try 
    { 
    //insert command (This is where the duplicate column error is thrown) 
    //Select @@Identity & Return it  
    } 
    catch (SqlCeException ex) 
    { 
    if (ex.NativeError == 25016) 
     MessageBox.Show("Username already in use."); 
    else 
    //whatever 
    } 
    finally 
    { 
    return -1; 
    } 

如果try塊返回標識值,那麼最後return -1不會影響。 Reference

+0

我不太好。如果您的代碼正常工作,它也會對右值返回-1。 –

+0

有什麼道理?如果代碼完美地工作,它會爲ValueToReturn分配值,這將返回 –

+0

是的,我是!我仍在等待你的理由? –