[解決済み】C#で例外をキャッチして再スローする理由とは?
質問
記事を見ています C# - データ転送オブジェクト シリアライズ可能なDTOに
この記事には、こんなコードもあります。
public static string SerializeDTO(DTO dto) {
try {
XmlSerializer xmlSer = new XmlSerializer(dto.GetType());
StringWriter sWriter = new StringWriter();
xmlSer.Serialize(sWriter, dto);
return sWriter.ToString();
}
catch(Exception ex) {
throw ex;
}
}
記事の残りの部分はまともで合理的に見えますが(noobにとっては)、そのtry-catch-throwはWtfExceptionを投げています...。 これはまさに例外処理を全くしないことと同じではないでしょうか?
エルゴです。
public static string SerializeDTO(DTO dto) {
XmlSerializer xmlSer = new XmlSerializer(dto.GetType());
StringWriter sWriter = new StringWriter();
xmlSer.Serialize(sWriter, dto);
return sWriter.ToString();
}
それとも、私はC#のエラー処理について何か基本的なことを見逃しているのでしょうか?Javaとほとんど同じ(チェックされた例外を除けば)じゃないですか。... つまり、どちらもC++を洗練させたものです。
スタックオーバーフローの質問 パラメータレスキャッチを再スローするのと、何もしないのとの違い? は、try-catch-throwは無意味であるという私の主張を支持しているようです。
EDITです。
今後このスレッドを見つけた人のために要約すると...
禁止事項
try {
// Do stuff that might throw an exception
}
catch (Exception e) {
throw e; // This destroys the strack trace information!
}
スタックトレース情報は、問題の根本的な原因を特定するために非常に重要です!
DO
try {
// Do stuff that might throw an exception
}
catch (SqlException e) {
// Log it
if (e.ErrorCode != NO_ROW_ERROR) { // filter out NoDataFound.
// Do special cleanup, like maybe closing the "dirty" database connection.
throw; // This preserves the stack trace
}
}
catch (IOException e) {
// Log it
throw;
}
catch (Exception e) {
// Log it
throw new DAOException("Excrement occurred", e); // wrapped & chained exceptions (just like java).
}
finally {
// Normal clean goes here (like closing open files).
}
より具体的な例外を、より具体的でない例外の前にキャッチする(Javaと同じ)。
参考文献
どのように解決するのですか?
まず、記事中のコードのやり方は邪道です。
throw ex
を実行すると、例外のコールスタックがこのthrow文のあるところまでリセットされ、例外が実際にどこで生成されたかという情報が失われます。
次に、このようにキャッチして再スローするだけなら、何の付加価値もないと思いますし、上記のコード例でも十分です。
throw ex
は、トライ・キャッチがなければ、さらに良い。
しかし、例外をキャッチして再スローしたいケースもあります。ロギングもその一つでしょう。
try
{
// code that may throw exceptions
}
catch(Exception ex)
{
// add error logging here
throw;
}
関連
-
[解決済み】取り消せないメンバはメソッドのように使えない?
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] 複数の例外を1行でキャッチする(ブロックを除く)
-
[解決済み] 複数の例外を一度にキャッチする?
-
[解決済み] Try-catchは私のコードをスピードアップさせるか?
-
[解決済み] Rubyで「例外 => e」を救済するのはなぜ悪いスタイルなのですか?
-
[解決済み】プログラムを停止/終了させることなく、完全な例外トレースバックをキャッチして表示する方法は?
-
[解決済み】WPFアプリケーションで例外をグローバルにキャッチする?
-
[解決済み】再試行キャッチはどのように実装するのですか?
-
[解決済み】例外が発生しないのにtry-catchブロックを使うのは高くつく?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】コンパイルエラー「未割り当てのローカル変数を使用しています」が発生したのはなぜですか?
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み】ASP.NET Core Dependency Injectionのエラーです。アクティブ化しようとしているときに、タイプのサービスを解決できません。
-
[解決済み】パディングが無効で、削除できない?
-
[解決済み】WPFでXamlファイルにコメントを追加する方法は?
-
[解決済み] UnityでOnCollisionEnterが呼ばれない
-
[解決済み】ユーザー設定値を別のユーザー設定値で設定する
-
[解決済み】名前 'ViewBag' が現在のコンテキストに存在しない - Visual Studio 2015
-
[解決済み] Javaでスタックトレースを失うことなく例外を再投入する
-
[解決済み] C#でスタックトレースを失うことなくInnerExceptionを再スローする方法は?