Anlegen eines try-blocks erzwingen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Beitragvon ms4py » Sonntag 19. April 2009, 22:33

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=]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");
}

}[/code]
BlackJack

Beitragvon BlackJack » Sonntag 19. April 2009, 22:41

@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.
Benutzeravatar
sparrow
User
Beiträge: 825
Registriert: Freitag 17. April 2009, 10:28

Beitragvon sparrow » Sonntag 19. April 2009, 22:42

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
jerch
User
Beiträge: 1622
Registriert: Mittwoch 4. März 2009, 14:19

Beitragvon jerch » Sonntag 19. April 2009, 22:46

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.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Montag 20. April 2009, 00:09

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
lunar

Beitragvon lunar » Montag 20. April 2009, 07:14

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.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Beitragvon Darii » Montag 20. April 2009, 07:42

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.

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot], martinjo, Methusalix