我正在看文章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; } }
文章的其余部分看起来很理智和合理(对于菜鸟来说),但是 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 一样)。
参考:
第一的; 文章中的代码这样做的方式是邪恶的。throw ex将异常中的调用堆栈重置到此 throw 语句所在的位置;丢失有关异常实际创建位置的信息。
throw ex
其次,如果你只是像这样捕获并重新抛出,我认为没有任何附加值,上面的代码示例在throw ex没有 try-catch 的情况下也一样好(或者,考虑到一点,甚至更好)。
但是,在某些情况下,您可能想要捕获并重新抛出异常。日志记录可能是其中之一:
try { // code that may throw exceptions } catch(Exception ex) { // add error logging here throw; }