Patrzę na artykuł C # - Obiekt transferu danych na temat szeregowych DTO.
Artykuł zawiera ten fragment kodu:
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;
}
}
Reszta artykułu wygląda rozsądnie i rozsądnie (dla nooba), ale ten rzut próbny rzuca wyjątek WtfEx ... Czy to nie jest dokładnie równoznaczne z brakiem obsługi wyjątków?
Ergo:
public static string SerializeDTO(DTO dto) {
XmlSerializer xmlSer = new XmlSerializer(dto.GetType());
StringWriter sWriter = new StringWriter();
xmlSer.Serialize(sWriter, dto);
return sWriter.ToString();
}
A może brakuje mi czegoś fundamentalnego w obsłudze błędów w C #? Jest prawie taki sam jak Java (bez zaznaczonych wyjątków), prawda? ... To znaczy, obaj dopracowali C ++.
Pytanie przepełnienia stosu Różnica między ponownym wyrzucaniem łapania bez parametrów a brakiem działania? wydaje się potwierdzać moją tezę, że try-catch-throw to brak możliwości.
EDYTOWAĆ:
Podsumowując, dla każdego, kto znajdzie ten wątek w przyszłości ...
NIE RÓB
try {
// Do stuff that might throw an exception
}
catch (Exception e) {
throw e; // This destroys the strack trace information!
}
Informacje dotyczące śledzenia stosu mogą być kluczowe dla zidentyfikowania pierwotnej przyczyny problemu!
ZROBIĆ
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).
}
Złap bardziej szczegółowe wyjątki przed mniej szczegółowymi (tak jak Java).
Bibliografia: