Zacznę od Wytycznych projektowych dla wyjątków krótkie i obejmują DO, DO NIE i UNIKAJ. Podaje również powody.
W twoim przypadku sekcją odkrywczą byłyby wyjątki pakowania
I spodziewałbym się, że będzie napisane w ten sposób. Zauważ, że wyłapuje określony wyjątek i próbuje dodać informacje, aby propagować bardziej znaczący komunikat. Należy również pamiętać, że wewnętrzny wyjątek jest nadal utrzymywany do celów logowania
//In DataLayer
try
{
XDocument xd_XmlDocument = XDocument.Load("systems.xml");
}
catch(FileNotFoundException ex)
{
throw new TransactionFileMissingException(
"Cannot Access System Information",ex);
}
AKTUALIZACJA
Kanini pyta, czy słusznie jest mieć ten blok wyjątków w warstwie danych, czy też sprawdzenie pliku powinno być dostępne dla warstwy biznesowej.
Na początek chciałbym zauważyć, że uzasadnienie owijania wyjątków jest takie
Rozważ zawijanie określonych wyjątków zgłaszanych z dolnej warstwy w bardziej odpowiednim wyjątku, jeśli wyjątek dolnej warstwy nie ma sensu w kontekście operacji na wyższej warstwie.
Więc jeśli uważasz, że wyższa warstwa powinna w ogóle wiedzieć o pliku, wtedy twoja warstwa danych powinna wyglądać tak
//In DataLayer
XDocument xd_XmlDocument = XDocument.Load("systems.xml");
No Try No Catch.
Osobiście uważam, że jeśli twoja warstwa danych nie jest w stanie zrobić czegoś pożytecznego, np. Użyj domyślnego pliku system.xml, który jest zasobem asemblera, nic nie robiąc lub owijając wyjątek jest dobrym wyborem, ponieważ twoje logowanie powie ci, która metoda i jaki plik był problemem. ( throw ex
w tym przypadku lub preferowane throw
też, ale nie dodaje żadnej wartości). Oznacza to, że po zidentyfikowaniu będziesz w stanie szybko rozwiązać problem.
Jako przykład ten konkretny przykład ma również następujący problem polegający na tym, że XDocument.Load może wyrzucić cztery wykonania
- ArgumentNullException
- Wyjątek bezpieczeństwa
- FileNotFoundException
- UriFormatException
Nie możemy bezpiecznie zagwarantować, że następujący kod nie zostanie zgłoszony i wyjątek FileNotFoundException, po prostu dlatego, że może on istnieć, gdy sprawdzamy istnienie, i znikać, gdy ładujemy. Udostępnienie tego warstwie biznesowej nie pomogłoby.
if (File.Exists("systems.xml"))
XDocument.Load("systems.xml");
SecurityException jest jeszcze gorszy, ponieważ między innymi powodami wyrzucenia, jeśli inny proces przechwytuje wyłączną blokadę pliku, nie dostaniesz błędu, dopóki nie spróbujesz otworzyć go do odczytu, ponieważ nie ma metody File.CanIOpenThis (). A jeśli taka metoda istniała, nadal masz ten sam problem, co w przypadku File.Exists