【发布时间】:2010-10-27 06:12:00
【问题描述】:
我正在查看关于可序列化 DTO 的文章 C# - Data Transfer Object。
文章中包含了这段代码:
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;
}
}
文章的其余部分看起来很理智和合理(对于菜鸟来说),但是 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++。
堆栈溢出问题The difference between re-throwing parameter-less catch and not doing anything? 似乎支持我的论点,即 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)。
参考资料:
【问题讨论】:
-
好总结;包含 finally 块的额外积分。
-
我想补充一点,你可以使用“throw;”通过在“抛出”之前添加发送到 e.Data 集合中的方法的参数来更有帮助;声明
-
@MickTheWarMachineDesigner(和兼职画家)。嗯?您正在谈论处理 Microshite Suckwell(据我所知,可能是 2005 年以后)异常。我说的是一般的异常处理。是的,自从我将近四年前发布这篇文章以来,我已经学到了一些……但是,是的,我承认你的观点是正确的,但我认为你错过了真正的观点;如果你明白我的意思?这个问题是关于 C# 中的 GENERALIZED 异常处理;更具体地说,关于重新抛出各种异常......酷吗?
-
请考虑将问题中的编辑摘要部分移至其自己的答案。原因见Editing self-answer out of question和Answer embedded in question。
-
没有人注意到“排泄物发生”部分吗?听起来代码像是被大便了!
标签: c# exception-handling try-catch