2011-07-06 1 views
3

例外を正しくバブルアップさせるにはどうすればいいですか?
メソッドを呼び出すときにTry-Catchを使用すると、まったくキャッチしようとしないなどの方法で例外をスローしているだけですか?
説明:これらのアプローチは同じ作業ですか?バブルアップを例外にする

例1:

try 
{ 
    MyFileHandlingMethod();    
} 
catch (IOException ex) 
{ 
    string recfilepath = "... 
    string rectoadd = "RecDateTime=" + DateTime.Now.ToString()+ ...+ex.Message.ToString(); 
    File.AppendAllText(recfilepath, rectoadd); 
} 
catch (exception) 
{ 
    throw; 
} 
... 
MyFileHandlingMethod() 
{ 
    ... 
    TextReader tr2 = new StreamReader(nfilepath); 
    resultN = tr2.ReadLine(); 
    tr2.Close(); 
    ... 
} 

例2:

try 
{ 
    MyFileHandlingMethod();    
} 
catch (IOException ex) 
{ 
    string recfilepath = "... 
    string rectoadd = "RecDateTime=" + DateTime.Now.ToString()+ ...+ex.Message.ToString(); 
    File.AppendAllText(recfilepath, rectoadd); 
} 
catch (exception) 
{ 
    throw; 
} 
... 
MyFileHandlingMethod() 
{ 
    ... 
    try 
    { 
     TextReader tr2 = new StreamReader(nfilepath); 
     resultN = tr2.ReadLine(); 
     tr2.Close();    
    } 
    catch (Exception) 
    { 
     throw;  
    }  
    ... 
} 

答えて

9

はい、これらの2つのアプローチは、同じ効果を有します。

あなたは(ログなど)を除いて、何もしないところ以下のようなキャッチ/スローブロック、無用です:

catch (Exception) 
{ 
    throw;  
} 

は、両方のあなたのサンプルでは、​​クリーンアップするためにそれを削除してください。

また、別の例外関連の問題があります。リソースを適切に解放しません。 tr2.Close();finally句に属しますが、それはコンパイラがusing() {}ブロックとそれを処理できるようにする方がはるかに簡単です:これは正しくリソースのクローズの世話をするよう

がすべての
void MyFileHandlingMethod() 
{ 
    ... 
    using (TextReader tr2 = new StreamReader(nfilepath)) 
    { 
    resultN = tr2.ReadLine();   
    } //tr2.Dispose() inserted automatically here   
    ... 
} 
2

まずあなたがリソースでusingブロックを使用する必要があります。 2番目の例は、例外ハンドラで作業をしないのでほとんど役に立ちません。いずれかを削除するか、別の例外でラップして情報を追加する必要があります。

2

はい、結果は同じです。

ただし、読み込み中にエラーが発生した場合、どちらもストリームが閉じられません。あなたは、ストリームが閉じていることを確認するためにusingブロックまたはtry ... finallyを使用する必要があります。

using (TextReader tr2 = new StreamReader(nfilepath)) { 
    resultN = tr2.ReadLine(); 
} 

(注)このコードにはCloseがないこと。 usingブロックはStreamReaderを処理し、ストリームを閉じます。

usingブロックはtry ... finallyにコンパイルされ、StreamReaderが常に破棄されていることを確認するために使用されますが、例外は呼び出し元のメソッドにバブルします。

1

私はあなたがこれらの変更で、あなたの最初の例を使用することをお勧め:

try 
{ 
    MyFileHandlingMethod();    
} 
catch (IOException ex) 
{  
    string recfilepath = "..."; 
    string rectoadd = "RecDateTime=" + DateTime.Now.ToString()+ ex.Message.ToString(); 
    File.AppendAllText(recfilepath, rectoadd); 
    throw; // rethrow the same exception. 
} 
// no need for second catch} 

あなたはおそらく、あなたがエラーからの実際の復旧を行っていないので、あなたは、それを記録した後、例外を再スローします。

関連する問題