2011-05-18 76 views
2

我已經在C#中構建了一個應用程序,在捕獲異常後我必須中斷應用程序。我使用return,但它返回到調用此模塊並繼續執行的模塊。應該做什麼?異常處理後需要破解

我的代碼看起來喜歡這樣的:

class a 
{ 
    b bee=new b{}; 
    bee.read(name); 
    bee.write(name);// don want this to get executed if exception is thrown 
} 

class b 
{ 
    read(string name) 
    { 
     try{} 
     catch 
     { 
      //caught; 

      //what should be put here so that it just stops after dialog 
      // box is shown without moving to the write method? 

     }  

     write(string name) {}     
    } 
} 
+0

您的示例不正確,無法編譯,請提供有效的代碼示例 – Dyppl 2011-05-18 05:43:10

+1

「break」是什麼意思?應用程序應該退出嗎?或者只是暫停一會兒? – Oded 2011-05-18 05:44:21

+0

當異常被捕獲時,是否要關閉整個應用程序? – Dyppl 2011-05-18 05:44:46

回答

1

你的代碼示例是不正確的,但讓我們假設你有一個方法這段代碼裏面:

void M() 
{ 
    b bee=new b(); 
    bee.read(name); 
    bee.write(name);// don want this to get executed if exception is thrown 
} 

如果是這樣,你必須趕上例外此方法,不在read方法中。像這樣:

void M() 
{ 
    try { 
     b bee=new b(); 
     bee.read(name); 
     bee.write(name);// don want this to get executed if exception is thrown 
    } 
    catch(Exception e) { 
     // Proper error handling 
    } 

} 

read方法你不應該壓制異常。要麼根本不抓住它們,要麼重新拋出它們(或者更好,然後拋出一個新的例外,舊例子是它的InnerExeption)。

如果用這種方法處理方法M中的異常,那麼如果在bee.read(name)內發生異常,則不會執行bee.write(name)行。

0

你可以這樣做如下

class a 
{ 
    b bee = new b(); 
    try 
    { 
    bee.read(name); 
    bee.write(name); 
    } 
    catch(Exception ex) 
    { 
     //handle error here 
    } 
} 

class b 
{ 
    //These are your method implementations without catching the exceptions in b 
    read 
    write 

} 

如果你發現在該方法中的例外,那麼你就不必知道exceution的任何方式該方法的狀態沒有考慮方法的某種錯誤狀態。無論這是一個布爾返回還是一個在b中可訪問的錯誤代碼。

0

爲什麼不讓read方法返回一個值給調用者呢?所以調用者檢查從讀取返回,如果它是(例如)null它不會寫入。或者,您的讀取方法可能會返回一個枚舉值,告訴調用方read方法退出的條件。

作爲另一種選擇,調用者可以使用doNotProceed方法實現接口,然後將其自身傳遞給讀取方法。在異常讀取調用caller.doNotProceed時,在調用者對象內設置一個內部變量,這告訴它不要繼續寫入。

你有足夠的選擇

1

讓例外泡了調用方法:

class A { 

    public void Method() { 
    B bee = new B{}; 
    try { 
     bee.Read(name); 
     bee.Write(name); 
    } catch(Exception ex) { 
     // handle exception if needed 
    } 
    } 

} 

class B { 

    public void Read(string name) { 
    try{ 
     ... 
    } catch(Exception ex) { 
     // handle exception if needed 
     throw; 
    } 
    } 

    public void Write(string name) { 
    } 

} 

注:如果您更多鈔票應該抓住的,而不是捕捉基類異常的更具體的異常類。沒有excpetion參數的catch語句已過時。

0

你可以使用return語句或重新拋出錯誤,並把另一個父級嘗試捕獲,但它更好地重構你的代碼。