2009-09-21 17 views
36

Zastanawiam się, jakiego rodzaju wyjątku powinienem użyć w przypadku brakujących danych. Na przykład, jeśli węzeł XML nie zawiera danych. Byłoby łatwo "rzucić nowe wyjątki (...)", ale nie jest to zalecane. Inną opcją byłoby utworzenie nowej klasy wyjątków, takiej jak MissingDataException lub InvalidDataException, ale czy nie istnieje wbudowana klasa wyjątków dla tego przypadku?Wyjątek dotyczący brakujących danych

+2

Po co wyrzucać wyjątek, gdy można zwrócić wynik funkcji, wskazując, że brakuje niektórych danych? – Lightman

Odpowiedz

48

Jako regułę należy sprawdzić istniejące wyjątki architektury .NET pod kątem odpowiedniego wyjątku, który należy wykonać przed wyliczeniem własnych. Aby odpowiedzieć bezpośrednio na twoje pytanie, nie ma obecnie żadnego "brakującego" wyjątku do rzucenia, ale to nie znaczy, że nie ma odpowiednich wyjątków, które pozwolą ci objąć twoją sytuację.

W twoim przypadku może być odpowiedni skromny InvalidOperationException; ten wyjątek jest generowany podczas wywoływania metody na obiekcie, ale stan obiektu nie jest odpowiedni dla operacji. Przykłady obejmują metody wywoływania w zamkniętym strumieniu i moduł wyliczający, który przeszedł koniec kolekcji. Jeśli dane XML są stanem wewnętrznym obiektu, a wywołanie metody wykryło złe dane, dobrym kandydatem jest InvalidOperationException.

Jeśli przekazujesz dane XML do metody, odpowiednim wyborem może być ArgumentException lub jedna z jego pochodnych. Istnieje niewielka rodzina tych wyjątków, z których wszystkie wskazują, że argument przekazany do metody nie jest oczekiwany.

Utworzenie niestandardowego wyjątku będzie możliwe tylko wtedy, gdy wyjątkowa okoliczność będzie obsługiwana inaczej niż inne wyjątki. Jeśli zdecydujesz się utworzyć własny wyjątek, upewnij się, że pochodzi on z wyższego wyjątku niż Exception, tak że charakter wyjątku jest implikowany przez klasę podstawową.

+0

+1 Zgadzam się w 100 procentach, używaj tego, co oferuje system i tylko wtedy, gdy nie możesz znaleźć czegoś, co zadziała, a następnie utwórz niestandardowe wyjątki. –

+0

Możliwym kandydatem będzie również 'ValidationException' –

2

Można użyć System.Xml.XmlException.

Edit: Nawet jeśli System.Xml.XmlException zmieściłoby, myślę, że należy zdefiniować własny wyjątek, ponieważ byłoby to bardziej precyzyjne i można opisać jaki rodzaj danych jest brakujące: id, data, itd

+3

System.Xml.XmlException jest używany przez środowisko wykonawcze do wskazywania błędu podczas odczytu dokumentu XML, szczególnie w przypadku, gdy kod XML ma niepoprawny format (np. Niezamknięty znacznik, brak elementu głównego). Zawiera nawet numery linii i znaków. Nie wydaje mi się szczególnie odpowiedni dla mnie. –

+0

Jeśli jego XML ma dane w węźle, a nie ma żadnego, IMO, kod XML nie ma poprawnego formatu, więc może pokazać, w którym wierszu (nawet ile znaków, jeśli chce). Myślę, że to pasuje, nawet jeśli zdefiniowanie własnego wyjątku byłoby lepsze. –

7

Nie wywołuj "throw new Exception", ponieważ nie wiesz, jak sobie z tym poradzić.

Zdefiniuj własny wyjątek. Bardziej szczegółowe, takie jak XMLDataMissingException. Następnie możesz dać meameful wiadomość do użytkownika lub zalogować się.

+0

Ustaw wiadomość ze szczegółami. –

-5

wyślij nowy wyjątek ("moja wiadomość"); (lub inny wbudowany wyjątek) jest często właściwym podejściem. Alternatywą jest eksplozja klas Wyjątek, które mogą zostać użyte tylko raz.

Jeśli nowe wyjątki są uzasadnione, powinny zostać utworzone w kontekście domeny, a nie problemu.

1

Jako ogólną zasadę należy zgłaszać wyjątki w wyjątkowych okolicznościach. Jeśli dane, o których mowa, negatywnie wpływają na stan obiektu lub zachowanie obiektu, należy podać niestandardowy wyjątek. Alternatywne podejście może obejmować jakiś rodzaj sprawdzania poprawności, który uruchamia zdarzenia, które klient obsługuje z wdziękiem, na przykład zgłosić błąd użytkownikowi końcowemu lub wstawić wartości domyślne.

Miałem podobny problem, który opisałeś, w którym miałem 2 klientów (nazywając je & B) odczytywanie i modyfikowanie pojedynczego pliku xml. Klient Usunięty węzeł X, a następnie Klient B podjął próbę zaktualizowania węzła X. Oczywiście aktualizacja węzła, który już nie istnieje, jest problemem. Aby rozwiązać ten problem, zaczerpnąłem inspirację z SQL Server, który zgłasza liczbę wierszy, których dotyczy instrukcja UPDATE.W tym konkretnym przypadku podniosłem zdarzenie UpdateNode w normalny sposób, a szereg wierszy ma wpływ na właściwość ustawioną na zero.

+0

Powinieneś prawdopodobnie zdefiniować, co masz na myśli przez * wyjątek niestandardowy * –

12

Istnieje również klasa System.Data.ObjectNotFoundException, którą możesz wziąć pod uwagę.

+1

Ten jest częścią System.Data.Entity.dll i może utworzyć niepotrzebną zależność. – Stijn

+4

@Stijn Sure.To dlatego powiedziałem "możesz rozważyć". –

Powiązane problemy