Seite 1 von 2

Verfasst: Sonntag 19. April 2009, 22:33
von ms4py
Mal abgesehen davon kann man die Exception in Java genau so nach oben weiter reichen (mit dem Schlüsselwort throws), das Abfangen der Exception ist nicht Pflicht!

Code: Alles auswählen

import java.net.MalformedURLException;
import java.net.URL;

public class ExcT {
   
    public static void main(String[] args) throws MalformedURLException {
        URL url = new URL("http://www.example.com");
    }

}

Verfasst: Sonntag 19. April 2009, 22:41
von BlackJack
@sparrow: NPEs kommen nur vor, wenn man versucht auf ``null`` wie auf ein Objekt zuzugreifen. Tja, und `MalformedURLException`\s kommen nur vor, wenn man eine URL übergibt, die keine ist. Und nun?

Code wäre durchaus "sicherer", wenn man weniger an NPEs denken müsste. Die Sprache Nice erlaubt zum Beispiel keine ``null``-Werte, wenn man nicht explizit bei der Deklaration angibt, dass die Variable auch den Wert ``null`` annehmen darf. Denn das braucht man ja eigentlich gar nicht so häufig -- meistens sorgt man ja dafür, dass die Variablen "ordentliche" Werte enthalten.

Java würde ich übrigens nicht als "rein objektorientiert" beschreiben. Dafür gibt es zu viele Sprachelemente, die keine Objekte sind. :-) Primitive Typen und Klassen zum Beispiel. Da ist Python schon "objektorientierter". Aber immer noch nicht so weit wie Io, wo es keine Klassen, sondern nur noch Objekte gibt, und auch die "Aufrufe" Nachrichten sind, die sich die Objekte zuschicken, wobei die Nachrichten natürlich auch wieder Objekte sind.

Dein Ansinnen ist einfach nicht lösbar. Du kannst nicht statisch feststellen welche Ausnahmen zur Laufzeit ausgelöst werden könnten.

Wenn Du die Qualität sichern willst, dann schreib ordentliche Unit-Tests.

Verfasst: Sonntag 19. April 2009, 22:42
von sparrow
ice2k3 hat geschrieben:Mal abgesehen davon kann man die Exception in Java genau so nach oben weiter reichen (mit dem Schlüsselwort throws), das Abfangen der Exception ist nicht Pflicht!
Auch das ist falsch.
In diesem Fall muss der Aufrufer dann die Fehlerbehandlung übernehmen oder weiterreichen. Ein "Unterschlagen" wie in Python ist somit nicht möglich, spätestens in der Main-Methode wird niemand auf die Idee kommen per throws weiter zu reichen.

Ich klinke mich an dieser Stelle mal aus.
Meine Frage war ob man das Behandeln von Exceptions in Python erzwingen kann. Diese Frage beantwortet man nicht mit Halbwahrheiten über andere Programmiersprachen.

Sparrow

Verfasst: Sonntag 19. April 2009, 22:46
von jerch
Solange eine Sprache nicht durch die Bank weg statisch typisiert, ist eine solche Forderung ziemlich hanebüchen.

Das Problem mal anders betrachtet, Python unterschlägt keine Exceptions, sondern tut das einzig Richtige, Fehler nach oben durchreichen bis der Standardhandler zuschlägt und eben die Programmausführung stoppt.

Btw ist mit unittests doch einiges zu entlarven und die sind für größere Projekte unablässig.

Verfasst: Montag 20. April 2009, 00:09
von Leonidas
Zu checked vs. unchecked Exceptions kann ich diesen Thread aus de.comp.lang.python empfehlen, wo Ole und Diez über den Nutzen von Checked Exceptions sprechen.

Ich muss sagen, dass ich sie auch fürchterlich lästig finde (ohne IDE sogar noch lästiger als sie sonst schon sind) und das C# als größte Konkurrenz zu Java darauf verzichtet ist auch bezeichnend.

Checked Exceptions gibt es in Python nicht und diese sind auch so nicht möglich.

Verfasst: Montag 20. April 2009, 07:14
von lunar
sparrow hat geschrieben:
ice2k3 hat geschrieben:Mal abgesehen davon kann man die Exception in Java genau so nach oben weiter reichen (mit dem Schlüsselwort throws), das Abfangen der Exception ist nicht Pflicht!
Auch das ist falsch.
In diesem Fall muss der Aufrufer dann die Fehlerbehandlung übernehmen oder weiterreichen. Ein "Unterschlagen" wie in Python ist somit nicht möglich, spätestens in der Main-Methode wird niemand auf die Idee kommen per throws weiter zu reichen.
Ich weiß nicht, wie man das in Java-Desktop-Programmen tut, weil ich das noch nie programmiert habe. In Java-Servlets jedenfalls ist es durchaus Usus, alle Ausnahmen, an denen man nicht interessiert ist, nach oben durchzureichen, weil der Applikationsserver dann einen sauberern Traceback fürs Debugging in die Log-Dateien schreibt und man nicht Gefahr läuft, mit einem inkonsistenten Zustand weiterzuarbeiten. Ich persönlich würde das auch bei Desktop-Programmen tun, da der Traceback im Falle einer ungewöhnlichen Ausnahme viel wichtiger ist als eine nichtssagende Fehlermeldung.

Meiner Erfahrung nach führt dieses Feature vor allem dazu, dass Ausnahmen an den unmöglichsten Stellen abgefangen und mit einem "System.out.println("Error occured: " + e.getMessage())" abgehandelt werden. Dabei geht der fürs Debugging essentielle Traceback verloren, und zudem läuft das Programm mitunter in einem völlig inkonsistenten Zustand weiter anstatt sauber zu terminieren.

Außerdem verhindert dieses Feature, dass man Dinge, die Ausnahmen werfen könnten, als Iterator implementiert. Die entsprechende Schnittstelle in Java wirft keine Ausnahmen, daher darf auch eine Implementierung keine Ausnahmen werfen. Einen Iterator zu implementieren, der "for (String line: file)" in Java ermöglicht, ist deswegen völlig unsinnigerweise unmöglich.

Meiner persönlichen Erfahrung nach verringert dieses Feature die Qualität von Java-Programmen meist eher, da die meisten Programmierer einfach eine generische Ausnahmeklausel schreiben, die alles abfängt und alle Debugging-Informationen verschluckt. Außerdem funktioniert es in anderen statischen Sprachen wie C# oder C++ ja auch ohne.

Verfasst: Montag 20. April 2009, 07:42
von Darii
sparrow hat geschrieben:Dadurch wird die Sicherheit aber nicht scheinbar, denn eine NullPointerException kann nur auftreten wenn auf Objekt verwiesen und zugegriffen wird das null ist.
Was ist denn daran nicht scheinbar? Der naive Betrachter mag doch annehmen, dass keine Exception fliegen kann eben weil man nichts abfangen muss. Das Problem sind in dem Fall aber auch nicht die NullPointerExceptions sondern die Tatsache, dass das Objekt überhaupt Null sein darf. Und das 1/0 gleich eine RuntimeException wirft, sollte wirklich nicht im Sinne des Erfinders sein.
Meine Frage war ob man das Behandeln von Exceptions in Python erzwingen kann. Diese Frage beantwortet man nicht mit Halbwahrheiten über andere Programmiersprachen.
Jetzt sei nicht beleidigt. Wenn du ein Verhalten „wie in Java“ möchtest musst du dich auch nicht wundern wenn man über Java spricht. Und Halbwahrheiten über Java wurden hier auch nicht verbreitet. Deine Frage wurde auch mehrfach beantwortet: Geht nicht ohne weiteres. Deine Zeit investierst du auf jeden Fall besser in das schreiben von Tests.