Sto guardando l'articolo C # - Data Transfer Object su DTO serializzabili.
L'articolo include questo pezzo di codice:
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;
}
}
Il resto dell'articolo sembra sano e ragionevole (a un noob), ma quel tentativo-catch-throw genera un'eccezione Wtf ... Non è esattamente equivalente a non gestire affatto le eccezioni?
Quindi:
public static string SerializeDTO(DTO dto) {
XmlSerializer xmlSer = new XmlSerializer(dto.GetType());
StringWriter sWriter = new StringWriter();
xmlSer.Serialize(sWriter, dto);
return sWriter.ToString();
}
O mi sto perdendo qualcosa di fondamentale sulla gestione degli errori in C #? È praticamente lo stesso di Java (meno le eccezioni controllate), non è vero? ... Cioè, hanno entrambi perfezionato C ++.
La domanda Stack Overflow La differenza tra rilanciare la cattura senza parametri e non fare nulla? sembra supportare la mia tesi secondo cui provare a catturare è un no-op.
MODIFICARE:
Riassumendo per chiunque trovi questa discussione in futuro ...
NON
try {
// Do stuff that might throw an exception
}
catch (Exception e) {
throw e; // This destroys the strack trace information!
}
Le informazioni sulla traccia dello stack possono essere cruciali per identificare la causa principale del problema!
FARE
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).
}
Cattura le eccezioni più specifiche prima di quelle meno specifiche (proprio come Java).
Riferimenti: