2011-07-28 14 views
1

我試圖設置try/catch/finally來表現得像if/else。我不確定最簡單的方法來做這件簡單的事情。什麼是最好的方式來使用C#try/catch/finally來表現得像if/else?

public bool login() 
{ 
bool isLoggedIn = false; 
if (connectToServer(Path,username,password)) // if successful 
    { 
    isLoggedIn = true; 
    } 
    else 
    { 

    } 

return isLoggedIn; 
} 

這是我嘗試使用例外。

public bool login() 
{ 
bool isLoggedIn = false; 

try{ 
    connectToServer(Path,username,password) 
    isLoggedIn = true; 
    } 
    catch(myConnectionException ex) 
    { 


    } 

return isLoggedIn; 
} 

二號線「isLoggedIn」將得到執行,雖然以前的生產線提升失敗時異常。我的想法是問「如果拋出異常,我不希望執行該行,我可以(我應該)在此時訪問異常對象以測試嗎?(或者它超出範圍?)我是一個前C編碼器,所以我想「保持C#」做一件簡單的事情,我只想完善自己的技能,並且符合「最佳實踐」 謝謝 DTM

+5

如果你想'try/catch'像'if/else'一樣工作,你就錯了。不要使用控制流的異常。 –

+0

我感謝大家的想法和方法。我現在有一個很好的工作。 –

回答

10

不,它不會得到執行。然而,這是不好的做法,因爲有一個昂貴的上下文切換來處理異常。你只應該在特殊案件使用異常。

我會考慮兩種方法相結合。

+0

最後一句話+1。 – John

+1

+1爲整個答案。您不使用例外來控制流量。 – aepheus

0

connectToServer如果不成功,應該拋出myConnectionException

4

做這樣的事情會有什麼問題?

bool isLoggedIn = false; 

try 
{ 
    isLoggedIn = connectToServer(Path, username, password); 
} 
catch (ExceptionType1 ex1) 
{ 
    //Recover from this exception type. 
} 
catch (ExceptionType2 ex2) 
{ 
    //Recover from this exception type. 
} 

異常不是if語句的「替代」。它們用於處理錯誤條件,如果發生錯誤,並且使用它們來控制應用程序的流程當然不是可取的。至少它們很慢,並且使用它們來控制流量可能會隱藏真正的實際錯誤,當您實際上希望應用程序失敗時。

編輯: 作爲@Anthony Pegram提到在下面的評論,所有的異常類型在一個catch塊處理是不好的做法,(東西我有罪常常的),因爲它也隱藏例外從你你可能真的想要專門處理。

+1

我反對你的代碼片段中的catch部分。它肯定不可能是你的意圖,因爲你的答案文本暗示了它的意思,但是你在代碼中的措詞是有害的。相反,你應該鼓勵捕捉*可以處理的狹義定義的異常,*不*任何可能的錯誤*,因爲這些應該簡單地向上發展。 –

+1

@Anthony - 你是對的,這不是我的意圖,但你說得很好,所以我澄清了我的答案。 –

0

我強烈建議將try/catch塊移到connectToServer。你不應該用異常來控制程序流,正如前面提到的那樣,上下文切換是非常糟糕的開銷。

讓connectToServer始終返回true或false(讓它在內部捕獲它的錯誤並返回false)。並簡單地:

return connectToServer(Path,username,password); 
+0

...但是如果下面的代碼會產生由此異常導致的不期望的或不希望的結果,我會捕獲可能的異常。 (好的,可以在其他地方捕捉到......但應該被捕獲。) – Beachwalker

+0

在我看來,最好是更一般地處理錯誤,而是使用檢測和驗證來防止錯誤。我經常看到使用try/catch而不是檢測和驗證。人們甚至不理解他們正在調用的代碼,只是將其包裝在try catch塊中... – aepheus

+0

例如,在這種情況下,connectToServer應該負責所有數據訪問問題(包括錯誤),並簡單地返回true或錯誤。應該先登錄才能驗證connectToServer的參數,並確保參數符合預期。 – aepheus

-1

這將工作,但不應該這樣做。你最好的選擇是將它編碼爲:

public bool login() 
{ 
    return connectToServer(Path,username,password); 
} 

短而甜。例外情況非常糟糕,除非特殊情況。當然,如果你想拿起connectToServer例外,那麼你可以使用類似:

public bool login() 
{ 
    try 
    { 
     return connectToServer(Path,username,password); 
    } 
    catch(exception ex)//or the specific exception you are after 
    { 
     return false; 
    } 
} 

意味着失敗的特殊場合將由例外有所回升,但大部分時間的異常會不叫。

0

在這個簡單的例子

isLoggedIn = true; 

如果有異常拋出所以還是假的(如初始化)如果連接調用拋出一個異常沒有達到。即使它不是捕獲的異常類型,設置isLoggin爲true的部分也不會被達到。

如前所述:不要使用異常而不是if/then/else或switch/case。如果您的代碼在將isLoggedIn設置爲true之後有更多的方法調用,那麼您應該將其重置爲false,因爲在catch中因爲這將是返回的結果。

順便說一句,在c#或i ++中使用異常的規則沒有區別。這對兩種語言都很常見。

相關問題