Moje (dotychczasowe) rozumienie wyjątku:
Sytuacja bezsensowna na tym poziomie zagłębienia kodu, z którą jednak jakaś metoda (istotnie) wyżej być może może sobie poradzić.
Czyli - przerzucamy kontrolę wyżej. Wyskakujemy nie z tej konkretnej funkcji, w której jesteśmy, ale idziemy w górę stosu tak wysoko, aż (być może) dojdziemy do funkcji, która powie: „z tym problemem mogę sobie poradzić”, czyli zawiera try
. Jak takiej funkcji nie będzie, no to crash. Jest to wygodne, ponieważ dzięki temu nie musimy opatrywać if
ami każdego wywołania być może problematycznej funkcji, jeśli z problemem i tak nie możemy zrobić nic, jak tylko przekazać go dalej.
if(!tryGetCośtam(out cośtam))
return false;
doSomething(cośtam);
return true;
vs
var cośtam = getCośtam(); // w razie czego wyjątek pójdzie wyżej
doSomething(cośtam);
return;
W tym drugim przypadku nie musimy zaprzątać sobie głowy ew. problemami, które mogą wystąpić gdzieś niżej, a z ktorymi i tak nie moglibyśmy sobie poradzić.
Nie bez pewnego zdziwienia zauważyłem, że dla wielu to jest przykład TRAGICZNEGO programowania. Nazywają to: „antipattern of exception-driven developmnent”.
W zasadzie ich poglądy można podsumować prosto: Jeśli aplikacja może kontynuować, NIE NALEŻY rzucać wyjątków, gdyż jest to sytuacja „sensowna biznesowo”. Wyjątki służą do scrashowania aplikacji; w innym wypadku należy użyć innych mechanizmów.
Nie rozumiem skąd dokładnie to podejście; ale OK; należy uznać, że nie jestem najmądrzejszy, jeśli bardziej doświadczeni ode mnie tak uważają to pewnie mają powody. (Chociaż nie wszędzie widzę, jak można łatwo zamienić wyjątki z tego na try pattern.
JEDNAK - dziwi mnie, że to jest zależne od języka??
W C# na przykład chyba wyjątki są zakazane, trzeba używać "try pattern". „Vexxing exceptions”.
A w Pythonie jest na odwrót. Tam wyjątki są na kopy. Tam gdzie JA (który i tak spamuję za wiele wyjątków) bym dał sprawdzenie if
em, tam Pythonowcy robią try
except
.
Zdaje się, że w Pythonie przyjęło się podejście: Zakładaj, że wszystko się uda, jeśli się nie uda to chwyć wyjątek i zajmij się tym.
Czyli, jest dokładna odwrotnośc tego, co się promuje w C# czy Javie.
SKĄD TE RÓŻNICE?!?!?!
Widzę 2 możliwości:
- To jest kwestia opinii i preferencji. Tak się przyjęło w C#/Javie, a w Pythonie inaczej; ale w zw. z tym nie ma (fundamentlalnych) przeszkód, by spamować wyjątkowami w Javie ani by ich unikać w Pythonie. I jakkolwiek unikanie WTF-ów ludzi przyzwyczajonych do podejścia przeciwnego może być istotnym argumentem, to jednak nie wystarczy to do uzasadnienia absolutyzmu obecnie promowanego twierdzenia, że „exception driven developmnet to antywzorzec”.
- Istnieją fundamentalne różnice między obsługą wyjątków w Pythonie vs Java/C#. Te fundamentalne różnice sprawiają, że w Pythonie wyjątki mogą być stosowane do control flow, zaś w Javie/C# już nie. ALe jakie to są różnice? Nie wiem. Ani nie wiem, co sprawia, że w Javie/C# nie należy rzucać wyjątków, gdy nie trzeba robić crasha.
Która z tych możliwości jest prawdziwa? Jeśli ta druga, to o czym nie wiem/ czego nie rozumiem? Jeśli żadna, to jak jest naprawdę?