2013-09-27 53 views
0

我使用try/catchthrow來處理異常。所以我使用try/catch是使用捕獲錯誤,其中包括像文件不存在等問題,然後使用throwtext包含錯誤的值。關於在C中拋出異常感到困惑#

Main()的基本佈局如下:

while ((line = sr.ReadLine()) != null) 
     { 
      try 
      { 
       //get the input from readLine and saving it 

       if (!valuesAreValid) 
       { 
        //this doesnt make the code stop running 
        throw new Exception("This value is not wrong"); 

       } else{ 
       //write to file 
       } 
      } 
      catch (IndexOutOfRangeException) 
      { 
       //trying to throw the exception here but the code stops 

      } 

      catch (Exception e) 
      { 

       //trying to throw the exception here but the code stops 


      } 

所以,如果你注意到我拋出一個異常try/catch和而試圖拋出Exception catch語句內部時,這並不停止程序,代碼停止。有沒有人有任何想法如何解決這個問題?

+0

你處理異常(捕獲它),然後什麼都不做,這意味着它會繼續。如果你扔進漁獲,沒有什麼可以抓住它。 – bryanmac

+0

如果它是你的Main()並且你想從catch塊中拋出expcetion ..你打算在哪裏處理拋出的異常..?它會讓你的應用程序崩潰 – Nitin

回答

3

如果您在catch內拋出異常,則不會由該catch處理。如果再沒有catch,你會得到一個未處理的異常。

try { 
    try { 
     throw new Exception("example"); 
    } catch { 
     throw new Exception("caught example, threw new exception"); 
    } 
} catch { 
    throw new Exception("caught second exception, throwing third!"); 
    // the above exception is unhandled, because there's no more catch statements 
} 
+0

我覺得這很有道理!讓我快點嘗試一下,然後回到你身邊! – User1204501

+0

噢好吧,所以我正在做的是,如果值是有效的,那麼'true或false',所以不知道'try'語句將如何工作=( – User1204501

+0

@ User1204501也許你可以更新你的問題來解釋你想要的做..也許你在使用'throw'時,其他一些方法會更好。 – Blorgbeard

0
while ((line = sr.ReadLine()) != null) 
     { 
      try 
      { 
       //get the input from readLine and saving it 

       if (!valuesAreValid) 
       { 
        //this doesnt make the code stop running 
        throw new Exception("This value is not wrong"); 

       } else{ 
       //write to file 
       } 
      } 
      catch (IndexOutOfRangeException) 
      { 
       //trying to throw the exception here but the code stops 

      } 

      catch (Exception e) 
      { 

       //trying to throw the exception here but the code stops 
      throw e; 

      } 
+0

你好,使用'throw e;'仍然停止在該行的代碼。 – User1204501

+0

儘管這並不能回答這個問題,但值得注意的是,你應該永遠不要捕獲並重新拋出這樣的異常。如果你想重新拋出剛剛捕獲的同一個異常,那麼你只需要寫'throw;' – TheEvilPenguin

0

我不確定您的意思是「停止該程序」。如果你不處理異常,程序將停止,但你的代碼正在處理你通過catch(Exception e)塊拋出的異常。 或者你的意思是你想退出while循環,在這種情況下你可以使用break

+0

我想那麼問題是在'try'語句中拋出一個異常 – User1204501

+0

@ User1204501問題是在'catch'語句中拋出一個異常。你可以在'try'部分內引發異常,或者在catch部分內添加另一個'try' /'catch'。 – TheEvilPenguin

+0

try catch塊用於處理異常。 catch塊可以是最基本的catch(Exception e),它將捕獲所有異常,因爲所有的異常都來自基類Exception。你可以刪除第二個catch塊,你的異常將不會被處理。 –

2

默認情況下,除非您在catch塊中重新拋出一個異常,否則異常將停止在捕獲它的「catch」塊處向上傳播。這意味着,該程序不會退出。

如果你不想捕捉異常,並希望程序退出,你有兩個選擇: - 刪除'異常'的捕獲塊 - 重新拋出其catch塊中的異常。

catch (Exception e) 
{ 
    throw e; // rethrow the exception, else it will stop propogating at this point 
} 

一般情況下,除非您對異常有一些邏輯迴應,否則應避免捕捉它。這樣你就不會「隱藏」或抑制應該導致程序錯誤的錯誤。

此外,MSDN文檔是一個不錯的地方,瞭解異常處理:http://msdn.microsoft.com/en-us/library/vstudio/ms229005%28v=vs.100%29.aspx

+2

不要拋出e,它會打破堆棧跟蹤。只要做「扔」。當然,如果你所做的所有事情都是重新拋棄的,那就沒有意義了。 – Blorgbeard

+0

歡迎來到StackOverflow Nikhil!恭喜第一個答案。 – Ameen