Normalerweise bevorzuge ich es, Ausnahmen intern zu behandeln (dh try / außer innerhalb der aufgerufenen Funktion, möglicherweise wird None zurückgegeben), da Python dynamisch typisiert ist. Im Allgemeinen halte ich es für einen Urteilsruf auf die eine oder andere Weise, aber in einer dynamisch typisierten Sprache gibt es kleine Faktoren, die den Ausschlag geben, die Ausnahme nicht an den Anrufer weiterzugeben:
- Jeder, der Ihre Funktion aufruft, wird nicht über die Ausnahmen informiert, die ausgelöst werden können. Es wird zu einer Art Kunstform, zu wissen, nach welcher Art von Ausnahme Sie suchen (und generische Ausnahmen außer Blöcken sollten vermieden werden).
if val is None
ist etwas einfacher als except ComplicatedCustomExceptionThatHadToBeImportedFromSomeNameSpace
. Im Ernst, ich hasse es, daran denken zu müssen, from django.core.exceptions import ObjectDoesNotExist
oben in all meinen Django-Dateien zu tippen, um einen wirklich häufigen Anwendungsfall zu behandeln. Lassen Sie den Editor in einer statisch typisierten Welt dies für Sie tun.
Ehrlich gesagt ist es jedoch immer ein Urteilsspruch, und die von Ihnen beschriebene Situation, in der die aufgerufene Funktion einen Fehler empfängt, dem sie nicht helfen kann, ist ein hervorragender Grund, eine sinnvolle Ausnahme erneut auszulösen. Sie haben genau die richtige Idee, aber es sei denn, Ihre Ausnahme liefert aussagekräftigere Informationen in einem Stack-Trace als
AttributeError: 'NoneType' object has no attribute 'foo'
Neun von zehn Fällen wird der Anrufer sehen, wenn Sie ein unbehandeltes None zurückgeben. Machen Sie sich keine Sorgen.
(All diese cause
Dinge lassen mich wünschen, dass Python-Ausnahmen standardmäßig die Attribute haben, wie in Java, mit denen Sie Ausnahmen an neue Ausnahmen übergeben können, damit Sie alles neu werfen können, was Sie wollen, und niemals die ursprüngliche Ursache des Problems verlieren.)