Czytanie artykułu Erica Lipperta na temat wyjątków zdecydowanie przykuło uwagę na to, jak powinienem podejść do wyjątków, zarówno jako producenta, jak i konsumenta. Jednak wciąż staram się zdefiniować wytyczne dotyczące tego, jak uniknąć zgłaszania irytujących wyjątków.
Konkretnie:
- Załóżmy, że masz metodę Save, która może zawieść, ponieważ: a) ktoś zmodyfikował rekord przed tobą , lub b) wartość, którą próbujesz utworzyć, już istnieje . Tych warunków należy się spodziewać i nie są one wyjątkowe, dlatego zamiast zgłaszać wyjątek, decydujesz się utworzyć wersję Try, TrySave, która zwraca wartość logiczną wskazującą, czy zapis się powiódł. Ale jeśli zawiedzie, skąd konsument będzie wiedział, na czym polegał problem? A może najlepiej byłoby zwrócić wyliczenie wskazujące wynik, rodzaj Ok / RecordAlreadyModified / ValueAlreadyExists? Z integer.TryParse ten problem nie istnieje, ponieważ istnieje tylko jeden powód, dla którego metoda może zawieść.
- Czy poprzedni przykład jest naprawdę irytującą sytuacją? Czy może preferowanie byłoby w tym przypadku wyjątkiem? Wiem, że tak właśnie dzieje się w większości bibliotek i frameworków, w tym frameworku Entity.
- W jaki sposób decydujesz, kiedy utworzyć wersję próbną metody, a nie zapewniając wcześniej sposób przetestowania, czy metoda zadziała, czy nie? Obecnie stosuję się do tych wskazówek:
- Jeśli istnieje szansa na wyścig, stwórz wersję próbną. Zapobiega to konieczności wychwycenia przez konsumenta egzogenicznego wyjątku. Na przykład w opisanej wcześniej metodzie Save.
- Jeśli metoda przetestowania warunku właściwie zrobiłaby wszystko, co robi oryginalna metoda, należy utworzyć wersję próbną. Na przykład integer.TryParse ().
- W każdym innym przypadku utwórz metodę przetestowania warunku.