@78gradn: Zwischen ``try`` und ``except`` muss ein eingerückter Code-Block stehen, deswegen bekommst Du die Ausnahme.
Man setzt ``try``/``except`` um die Anweisung(en) bei denen man einen oder mehrere *konkrete* Ausnahmen erwartet und die man *sinvoll* *behandeln* kann. Also zwischen ``except`` und dem ``:`` sollte eigentlich immer etwas stehen, ein ”nacktes” ``except:`` wie in Deinem Beispiel ist fast immer falsch. Das macht man eigentlich nur wenn man in der Behandlung dann entweder die Ausnahme erneut auslöst oder komplett, inklusive Traceback protokolliert, damit man eine Chance hat unerwartetes zu entdecken und herauszufinden welche Ausnahmen da ”unterdrückt” wurden. Ansonsten kann die Fehlersuche schwierig bis unmöglich werden.
Der ``try`-Block sollte auch möglichst kurz sein, damit man möglichst nur eine Quelle für die Ausnahme hat die man im ``except``-Block behandelt. So etwas wie ein `ValueError` kann bei vielen Operationen passieren, auch in Funktionen die man aufruft, oder Funktionen die von den Funktionen aufgerufen werden die man selber aufruft. Und wenn man zig Codezeilen im ``try``-Block stehen hat und im ``except ValueError:`` dann alle Möglichkeiten wie in diesen Zeilen ein `ValueError` auftreten kann, gleich behandelt, dann ist das sehr wahrscheinlich keine angemessene Ausnahmebehandlung. Wenn man auf kurze ``try``-Blöcke achtet, sollte man nicht vergessen das zu einem ``try``/``except`` auch ein ``else``-Block gehören kann! Nämlich für den Fall das *keine* Ausnahme im ``try``-Block aufgetreten ist.
Ein einfaches ``print 'Fehler!'`` ist übrigens in aller Regel auch keine sinnvolle Fehlerbehandlung. Das nutzt weder dem Benutzer noch dem Programmierer herauszufinden was denn der Fehler eigentlich war. Ist das einer im Programm? Oder einer der durch falsche Eingaben vom Benutzer entstanden ist? Was ist/war die Ursache? Das muss man ja sowohl als Benutzer als auch als Programmierer wissen um das Problem zu korrigieren. Und da ist eine Ausnahme die unbehandelt zum Programmabbruch führt und eine Nachricht ausgibt *und* einen Traceback der Rückschlüsse auf den Programmablauf zulässt, der zu der Ausnahme geführt hat, nützlicher als ein nichtssagendes 'Fehler!'. Oder 'nei' — das ist nicht besser.
Die Frage ist also wo und welche Ausnahme(n) Du erwartest. Beim ``print g`` offenbar keine, und das wohl auch zurecht, denn das meiste was dabei schief gehen kann, ist an der Stelle sowieso nicht sinnvoll behandelbar. Du musst also schauen wo Du Ausnahmen bekommen kannst und wie man die dann behandeln kann. Gibt es irgendwo Operationen oder Funktionsaufrufe bei denen Werte involviert sein können für die diese Operationen oder Funktionen nicht sinnvoll angewendet werden können und deshalb Ausnahmen ausgelöst werden?
Anmerkungen zum Code: Gib den Werten vernünftige Namen die dem Leser vermitteln was der Wert bedeutet. Einbuchstabige Namen dem Alphabet nach sind das eher nicht. Und man muss auch nicht jedes kleine Zwischenergebnis an einen Namen binden wenn man das nicht mehr als einmal benötigt, vor allem nicht wenn der Name auch noch nichtssagend ist.
Für `a` und `b` könnte man auch `math.radians()` verwenden, dann weiss man als Leser schneller was diese Rechnung soll, beziehungsweise kann in der Dokumentation die Funktion nachlesen und weiss es dann.