Nasz kod znajduje ogólny wyjątek wszędzie.Jak zmienić zastosowanie ogólnego wyjątku?
Zwykle zapisuje błąd w tabeli dziennika w bazie danych i pokazuje komunikat do użytkownika, informujący, że operacja nie powiodła się. Jeśli istnieje interakcja z bazą danych, transakcja jest wycofywana.
Wprowadziłem warstwę logiki biznesowej i warstwę dostępu do danych, aby rozwikłać niektóre elementy logiki. W warstwie dostępu do danych wybrałem, aby niczego nie łapać, a także zgłaszam argumenty ArgumentNullExceptions i ArgumentOutOfRangeExceptions, dzięki czemu komunikat przekazywany do stosu nie pochodzi prosto z bazy danych.
W warstwie logiki biznesowej wstawiłem próbę catch. W haku wycofuję transakcję, wykonuję rejestrowanie i ponowne zgłaszanie.
W warstwie prezentacji znajduje się kolejna próba przechwytywania, która wyświetla komunikat MessageBox.
Teraz myślę o przechwytywaniu wyjątku DataException i ArgumentException zamiast wyjątku, gdy wiem, że kod tylko uzyskuje dostęp do bazy danych.
Gdzie kod uzyskuje dostęp do usługi sieciowej, wtedy pomyślałem, że utworzę własny "WebServiceException", który zostanie utworzony w warstwie dostępu do danych za każdym razem, gdy zostanie zgłoszony wyjątek HttpException, WebException lub SoapException.
Więc teraz, ogólnie rzecz biorąc, złapię 2 lub 3 wyjątki, w których obecnie łapię tylko ogólny wyjątek, i wydaje mi się, że wydaje mi się to w porządku. Czy ktoś ponownie zawija wyjątki, aby przenieść wiadomość do warstwy prezentacji?
Myślę, że prawdopodobnie powinienem dodać próbę catch do Main(), która przechwytuje wyjątek, próbuje go zarejestrować, wyświetla komunikat "Aplikacja napotkała błąd" i kończy działanie aplikacji. Moje pytanie brzmi, czy ktoś widzi jakieś dziury w moim planie? Czy są jakieś oczywiste wyjątki, które powinienem złapać lub zrobić, że te prawie pokrywają to (inne niż dostęp do pliku - myślę, że jest tylko jedno miejsce, w którym zapisujemy do pliku konfiguracyjnego).
Doskonały punkt na temat końcowego lub użycia wyciągu. Już to robię, gdy transakcja jest w DAL, ale niektóre z moich transakcji nadal znajdują się w BLL, więc myślę, że będę musiał ujawnić metodę MyDatabase.Dispose(), lub zawinąć moją SqlCeTransaction dla "używania" oświadczenia – Colin
Nie wiesz, co masz na myśli przez fizyczną granicę. Czy nie ma granicy przy każdym wywołaniu metody od BLL do DAL? W takim przypadku każde wywołanie w BLL powinno mieć log try/catch log/throw pattern. Ale jeśli będzie to oznaczać fizyczną granicę między aplikacją a bazą danych, aplikacją i usługą sieciową lub aplikacją i systemem plików, to przeniesie moje logowanie do DAL, a nie do BLL. Ale mówisz, że prawie nie ma żadnych pułapek w DAL lub BLL, i oczywiście właśnie utkwiłem, że połowy powinny siedzieć w klasie "MyDatabase", gdzie wszystkie aktualizacje wstawiają się i kasują. To brzmi znacznie lepiej. – Colin