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

Anlegen eines try-blocks erzwingen

Beitragvon sparrow » Sonntag 19. April 2009, 19:16

Guten Tag,

kurze Frage:
kann ich Python in einen Modus 'schalten' der das Abfangen von Exceptions erzwingt?

Soweit ich verstehe kann ich eine Exception abfangen, muss das aber nicht. Fange ich sie nicht wird die Exception so lange nach oben weiter gereicht bis das Programm abbricht.

Mir würde ein Verhalten wie in Java, wo eine 'normale' Exception' irgendwo behandelt werden muss, viel mehr entgegen kommen.


Danke!

Sparrow
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Beitragvon birkenfeld » Sonntag 19. April 2009, 19:27

Kurze Antwort: nein, es gibt keine "checked exceptions". Python kann weder zur Kompilier- noch zur Laufzeit wissen, welche Exceptions ein Aufruf auslösen kann, bis wirklich eine ausgelöst wird.

Eine längere Antwort erfordert, dass du noch ein bisschen mehr über deine eigentlichen Anforderungen erzählst. :)
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
Sunjy
User
Beiträge: 31
Registriert: Dienstag 3. März 2009, 19:13
Wohnort: 127.0.0.1
Kontaktdaten:

Beitragvon Sunjy » Sonntag 19. April 2009, 19:28

ich glaube das geht nicht. das müsstest du per hand machen oder eben in die oberste zeile schon try: und ganz unten eben except: print ":(" ^^ sorry

/edit: zu langsam.. :roll:
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Beitragvon derdon » Sonntag 19. April 2009, 19:34

Zeig mal bitte Beispielcode, wo man so etwas braucht. Ich kann mir das sehr schlecht vorstellen, weil ich (noch) nicht mit Java in Berührung kam.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Sonntag 19. April 2009, 19:37

derdon hat geschrieben:Ich kann mir das sehr schlecht vorstellen, weil ich (noch) nicht mit Java in Berührung kam.


Ein Glückspilz! :D
Benutzeravatar
sparrow
User
Beiträge: 825
Registriert: Freitag 17. April 2009, 10:28

Beitragvon sparrow » Sonntag 19. April 2009, 19:52

Hallo Sunjy,

hier mal ein Beispiel aus Java, ein simples Programm das genau gar nichts macht ausser ein Objekt der Klasse URL zu instanzieren. Dafür gibt es die Möglichkeit den Namen der URL als String zu übergeben.

Code: Alles auswählen

import java.net.URL;

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

}


Unter Java lässt sich der Code jedoch so nicht übersetzen da eine MalformedURLException abgefangen werden muss. Ich bin als gezwungen zu definieren was passiert falls die entsprechende Exception auftritt. Folgender Code würde sich problemlos übersetzen lassen:

Code: Alles auswählen

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

public class ExcT {
   
   public static void main(String[] args) {
      try {
         URL url = new URL("http://www.example.com");
      } catch (MalformedURLException e) {
         // Catch the Exception here
      }
   }

}


Genau so ein Verhalten würde ich mir auch bei Python wünschen, da ich mir gut vorstellen kann bei größeren Projekten gerne mal einen try-Block zu vergessen. Mir wäre es lieber die Umgebung würde darauf bestehen, dass Ausnahmen auch behandelt werden.

Gruß
Sparrow
Benutzeravatar
Sunjy
User
Beiträge: 31
Registriert: Dienstag 3. März 2009, 19:13
Wohnort: 127.0.0.1
Kontaktdaten:

Beitragvon Sunjy » Sonntag 19. April 2009, 20:02

das geht wie gesagt glaube nicht. aus deinem Quelltext oben kann ich nur aufgrund von Erfahrung herauslesen, da ich kein Java kann, abe rich glaube zu wissen was er tut, du hasts ja auch erklärt.

Trotzdem wie gesagt ich glaube, dass du da mit try und except arbeiten musst.

Zumindest weis ICH nicht wie es geht, wenn es überhaupt machbar ist.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Beitragvon derdon » Sonntag 19. April 2009, 20:02

Das finde ich ziemlich schwachsinnig. Warum werde ich dazu gezwungen Fehler abzufangen, die *vielleicht* gar nicht auftreten? Ein Fehler soll doch nur dann abgefangen werden, wenn auch einer auftritt.
Benutzeravatar
sparrow
User
Beiträge: 825
Registriert: Freitag 17. April 2009, 10:28

Beitragvon sparrow » Sonntag 19. April 2009, 20:11

derdon hat geschrieben:Das finde ich ziemlich schwachsinnig. Warum werde ich dazu gezwungen Fehler abzufangen, die *vielleicht* gar nicht auftreten? Ein Fehler soll doch nur dann abgefangen werden, wenn auch einer auftritt.


Nunja, Schwachsinnig ist das nicht.
Du definierst ja das was passiert wenn der Fehler auftritt. Die try-Blöcke jeder mir bekannten Programmiersprache funktionieren so, auch die in Python.

Sunjy hat geschrieben:Trotzdem wie gesagt ich glaube, dass du da mit try und except arbeiten musst.

Mit try und except muss ich so oder so arbeiten. Ich will nur in den Popo getreten werden falls ich es nicht tue ;)

Schade, dass das in Python nicht funktioniert. Ich denke das liegt daran, dass in Pyhon erst zur Laufzeit kompiliert oder interpretiert wird, bzw. es keinen erzwungenen Compilerschritt gibt der den Quellcode untersucht.

Ich werde mal drüber nachdenken und schauen ob ich nicht ein Tool bastele was einen Python-Quelltext auf unbehandelte Exeptions untersucht.

Trotzdem danke!

Sparrow
jerch
User
Beiträge: 1623
Registriert: Mittwoch 4. März 2009, 14:19

Beitragvon jerch » Sonntag 19. April 2009, 20:31

Mit so einer Anforderung stellst Du halt das dynamische Konzept teilweise in Frage, welches für viele Leute gerade den Prinz-Charming-Faktor von Skriptsprachen ausmacht. Kompilierende Sprachen sind für sowas (wie auch Typprüfungen) im Vorteil, da das während des Kompilierens schon abgefangen werden kann.

In Python könntest Du sowas durch Decoratoren halbwegs elegant nachbauen, wobei ein zu intensiver Gebrauch hiervon den Code mächtig aufbläst, der zur Laufzeit dann auch gestemmt werden muß.
Nocta
User
Beiträge: 290
Registriert: Freitag 22. Juni 2007, 14:13

Beitragvon Nocta » Sonntag 19. April 2009, 21:23

Was hast du eigentlich konkret dagegen?
Wenn du eine Exception vergisst, merkst du das spätestens wenn die Exception bis nach oben gereicht wurde und das Programm abstürzen lässt.
Und so schwer ist's auch nicht an den richtigen Stellen solche try-catch Blöcke zu setzen ;) Man sieht doch quasi "Ah, hier könnte was schief laufen" und "Hier tritt sicherlich keine Exception aus (außer vllt nem SyntaxError)".

Und wenn du wirklich mal etwas übersehn hast und das Programm abstürzt ... Wo liegt das Problem? Einfach abändern.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Beitragvon Darii » Sonntag 19. April 2009, 21:28

sparrow hat geschrieben:Schade, dass das in Python nicht funktioniert. Ich denke das liegt daran, dass in Pyhon erst zur Laufzeit kompiliert oder interpretiert wird, bzw. es keinen erzwungenen Compilerschritt gibt der den Quellcode untersucht.
Nein, in der Beziehung verhält sich Python genau wie Java (bis auf die Tatsache, dass ein JIT fehlt). Das liegt daran, dass Python dynamisch typisiert ist, deswegen kann, wie birkenfeld schon schrieb, Python nicht wissen ob eine Exception geworfen werden kann.

Deswegen ist es auch sehr anspruchsvoll so ein Tool zu schreiben, das dies erledigt. Dazu müsstest du schon konsequent die Typen und Exceptions angeben (z.B. über die Python 3 function annotations oder Kommentare) und das dann auswerten. Und zwar überall, also könntest du weder die Standardbibliothek noch Bibliotheken von Dritten verwenden. In dem Fall wäre es dann wohl wirklich sinnvoller eine andere Sprache zu verwenden.
BlackJack

Beitragvon BlackJack » Sonntag 19. April 2009, 21:38

Mal davon abgesehen, das Python für "checked exceptions" zu dynamisch ist, haben auch viele statisch kompilierte Sprachen mit Ausnahmebehandlung so etwas nicht. "checked exceptions" sind für mich eines der grössten Probleme in Java. Es verhindert zum Beispiel, dass man einfach generischen Code schreiben kann. Zum Beispiel so etwas wie `map()` mit einem "Funktionsobjekt" und einem Iterator, weil man ja nicht weiss, was das Funktionsobjekt alles als Ausnahme werfen kann. Workaround ist bei so etwas dann normalerweise, dass man eine eigene Ausnahme definiert und alles fängt und in diese neue Ausnahme verpackt um es dann weiter zu werfen. Aufrufer müssen dann die Ausnahme fangen und reinschauen, was denn der eigentliche Grund war. Das wird schnell hässlich.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Beitragvon Darii » Sonntag 19. April 2009, 21:49

Davon abgesehen, dass es bei Java immer noch Nullpointer-Exceptions gibt, die man nicht abfangen muss. Ist also auch nur eine scheinbare Sicherheit.
Benutzeravatar
sparrow
User
Beiträge: 825
Registriert: Freitag 17. April 2009, 10:28

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

Darii hat geschrieben:Davon abgesehen, dass es bei Java immer noch Nullpointer-Exceptions gibt, die man nicht abfangen muss. Ist also auch nur eine scheinbare Sicherheit.

Das ist falsch. Es gibt in Java Runtime-Exceptions (unchecked exceptions) die man nicht fangen muss aber kann, dazu gehört auch die NullPointerException.
Dadurch wird die Sicherheit aber nicht scheinbar, denn eine NullPointerException kann nur auftreten wenn auf Objekt verwiesen und zugegriffen wird das null ist.
Falls das anders sein sollte müsste dann der gesamte Quellcode in einem try/catch-Block stehen, denn als rein objektorientierte Sprache kommt in so ziemlich jeder Zeile eine Objekt vor.
So einfach kannst du es dir daher nicht machen.

Ich bin bereits am schauen wie man möglichst einfach an die benötigten Informationen kommt um prüfen zu lassen welche Exceptions in einem Programm nicht abgefangen werden.
Für die Qualitätsprüfung von Code finde ich das ziemlich wichtig und bei größeren Projekten unerlässlich.
Dynamik hin oder her, zumindest die Möglichkeit der Prüfung sollte es mE geben.

Gruß
Sparrow

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder