Tak więc ostatnio piszę stosunkowo złożoną aplikację napisaną w języku C#, która wykonuje wiele małych zadań wielokrotnie. Kiedy po raz pierwszy uruchomiłem aplikację, zdałem sobie sprawę, że wiele kodu, który pisałem, było powtarzalne i dlatego zacząłem enkapsulować większość logiki aplikacji w oddzielne klasy pomocnicze, które mogłem wywołać w razie potrzeby.Gdzie jest prawidłowe miejsce do obsługi wyjątków w aplikacjach C#?
Nie trzeba dodawać, że wielkość mojej aplikacji (i ilość kodu) została zmniejszona o połowę. Ale gdy przechodziłem, zauważyłem coś innego w mojej aplikacji, które wydawało się być powtarzalne i wyglądało na to, że można je poprawić.
Teraz większość moich metod w moim klas pomocniczych są albo dokonywania HttpWebRequest
lub wykonywania Zapisz/usuń operacji na plikach. Powiedziawszy, że muszę poradzić sobie z możliwością, że połączenie się nie zakończy, lub plik nie może zapisać, ponieważ nie ma wystarczająco dużo miejsca lub cokolwiek innego. Problemem, który napotykam, jest to, że muszę ciągle pisać instrukcje try/catch za każdym razem, gdy wywołuję jedną z metod. Oprócz tego muszę ponownie wpisać komunikat o błędzie (lub W końcu komunikat o stanie. Chciałbym wiedzieć, kiedy to się uda).
Więc oto niby urywek co mam wpisać:
try
{
ItemManager.SaveTextPost(myPostItem);
}
// Majority of the time there is more than one catch!
catch
{
//^^^Not to mention that I have to handle multiple types of exceptions
//in order to log them correctly(more catches..ugh!)
MessageBox.Show("There was an error saving the post.");
//Perform logging here as well
}
Z tego co zawarły tak daleko jest:
- Dla mnie to jest przesada konieczności pisania w tym ponad 50 razy dla mojej aplikacji. Wygląda na to, że powinienem to uwzględnić w klasie pomocnika, a to pełny zestaw połowów.
- Ale jak mogę znać wynik? Być może myślałem o zwrocie ciąg , który zawiera komunikat o błędzie/powodzenie.
- Naprawdę w przypadku tych metod nie jest wymagana metoda, z której wywoływana jest metoda pomocnika, aby zamknąć ją w bloku try/catch.
Czy to podejście jest prawidłowe? Czy istnieje inny sposób robienia tego? Czy powinienem używać metody try/catch w metodzie wywołania? Od tego rodzaju moich pierwszych ujęć chciałbym usłyszeć, co mają do powiedzenia inni, którzy mieli do czynienia z tym scenariuszem.
Podobne pytanie zadano niedawno: http://stackoverflow.com/questions/8156530/exception-handling-in-method-definition-or-call/8156574#8156574 – Tudor