Я переглядаю статтю 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;
}
}
Інша частина статті виглядає розумною та розумною (для noob), але цей спробу-ловля кидає 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 ++.
Питання про переповнення стека Різниця між повторним закиданням без укладання параметрів і нічого не робить? Мабуть, підтримує моє твердження, що пробувати-кидати - не-оп.
Редагувати:
Просто підвести підсумок для тих, хто знайде цю тему в майбутньому ...
НЕ
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).
Список літератури: