Powiel możliwe:
Python FAQ: “How fast are exceptions?”Python - sprawność złowionych wyjątkami
pamiętam czytanie że Python implementuje „Lepiej prosić o przebaczenie niż prosić o pozwolenie” filozofię w odniesieniu do wyjątków . Według autora oznaczało to, że kod Pythona powinien używać wielu klauzul try - except, zamiast próbować określić z wyprzedzeniem, czy miałeś zamiar zrobić coś, co spowodowałoby wyjątek.
Właśnie napisałem kilka prób - z wyjątkiem klauzul w mojej aplikacji internetowej, w której wyjątek zostanie podniesiony przez większość czasu, gdy kod jest uruchamiany. Tak więc w tym przypadku podniesienie i złapanie wyjątku będzie normą. Czy to jest złe z punktu widzenia wydajności? Pamiętam też, jak ktoś mi mówił, że wychwycenie podniesionego wyjątku ma duży wpływ na wydajność.
Czy korzystanie z klauzul try - except jest niepotrzebnie nieefektywne, ponieważ oczekuje się, że wyjątek zostanie podniesiony i przechwycony przez prawie cały czas?
Oto kod - używa ORD Django do sprawdzania obiektów, które kojarzą użytkowników z różnymi dostawcami usług społecznościowych.
try:
fb_social_auth = UserSocialAuth.objects.get(user=self, provider='facebook')
user_dict['facebook_id'] = fb_social_auth.uid
except ObjectDoesNotExist:
user_dict['facebook_id'] = None
try:
fs_social_auth = UserSocialAuth.objects.get(user=self, provider='foursquare')
user_dict['foursquare_id'] = fs_social_auth.uid
except ObjectDoesNotExist:
user_dict['foursquare_id'] = None
try:
tw_social_auth = UserSocialAuth.objects.get(user=self, provider='twitter')
user_dict['twitter_id'] = tw_social_auth.uid
except ObjectDoesNotExist:
user_dict['twitter_id'] = None
Pierwszy z nich rzadko się wyjątek, ponieważ teraz jesteśmy egzekwowania „Zaloguj się z Facebook” jako podstawowej metody dla nowych użytkowników do przyłączenia się do witryny. Ale Twitter i Foursquare są opcjonalne, na wypadek, gdyby chcieli zaimportować znajomych lub obserwujących i oczekuję, że większość ludzi tego nie zrobi.
Jestem otwarty na lepsze sposoby kodowania tej logiki.
Jaki jest konkretny przykład kodu? –
Stosowanie "Lepiej starać się o przebaczenie, niż prosić o zgodę" wszędzie tam, gdzie ma to zastosowanie, zdecydowanie nie jest najlepszym pomysłem. Rozważmy to: jeśli wiesz, że w 95% wywołań do kodu wewnątrz 'try..catch' zostanie zgłoszony wyjątek, lepiej przepisz go. –
Jedno powiedzenie, które brzmi "wyjątki są dla wyjątkowych przypadków". Sądzę, że jeśli spodziewasz się wyjątku przez większość czasu, być może używasz wyjątków w niewłaściwy sposób. –