記事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は何もしないという私の主張をサポートしているようです。
編集:
将来このスレッドを見つけた人のために要約すると...
しない
try {
// Do stuff that might throw an exception
}
catch (Exception e) {
throw e; // This destroys the strack trace information!
}
スタックトレース情報は、問題の根本的な原因を特定する上で非常に重要です。
行う
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のように)より具体的でない例外の前に、より具体的な例外をキャッチします。
参照: