직렬화 가능한 DTO 에 대한 기사 C #-데이터 전송 개체 를보고 있습니다.
이 기사에는 다음 코드가 포함되어 있습니다.
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와 같이 덜 구체적인 예외보다 더 구체적인 예외를 포착하십시오.
참고 문헌 :