为什么在C#中捕获并重新抛出异常?

我在看关于可序列化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;
    }
}

文章的其余部分看起来健全和合理(对noob),但try-catch-throw抛出一个WtfException …这不完全等同于不处理异常?

Ergo:

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。

Stack Overflow问题The difference between re-throwing parameter-less catch and not doing anything?似乎支持我的争论,try-catch-throw is-a no-op。

编辑:

只是为了总结任何人谁找到这个线程在未来…

不要

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一样)。

参考文献:

> MSDN – Exception Handling
> MSDN – try-catch (C# Reference)

最佳答案
第一;文章中的代码的方式是邪恶的。 throw ex将把异常中的调用栈重置到这个throw语句所在的点;丢失有关异常实际创建位置的信息。

第二,如果你只是捕捉和重新抛出像这样,我看不到增加价值,上面的代码示例将会是一样好(或者,没有try-catch的情况下,抛出ex位,甚至更好)。

但是,在某些情况下,您可能希望捕获并重新抛出异常。日志可以是其中之一:

try 
{
    // code that may throw exceptions    
}
catch(Exception ex) 
{
    // add error logging here
    throw;
}

转载注明原文:为什么在C#中捕获并重新抛出异常? - 代码日志