Checked Exceptions in .Net?

Thomas Darimont

Erfahrenes Mitglied
Hallo,

in .Net gibts ja zumindest in C# / VB.Net keine Unterstützung für Checked Exceptions. Da nun aber gern Checked Exceptions in C# nutzen würde habe ich mir mal überlegt wie man sowas selber bauen könnte:
http://www.postsharp.org/community/forums/laos/325120299

Das witzige daran ist, dass ich gestern mal aus Spaß ein J# Programm im Reflector angeschaut habe...:

Aus:
Java:
package ConsoleApplication1;

/**
 * Zusammenfassungsbeschreibung für das Programm
 */
public class Program
{
    public static void main(String[] args)
    {
        //
        // TODO: Code zum Starten der Anwendung hier hinzufügen
        // 

        java.util.List list = new java.util.ArrayList();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        System.out.println(list);

        try{
            operation1();
        }catch(Throwable t){
            t.printStackTrace();
        }

        operation2();

    }

    public static void operation1() throws Exception
    {
        throw new Exception();
    }

    public static void operation2()
    {
        throw new RuntimeException();
    }
}

Wird im Reflector:
C#:
public class Program
{
    // Methods
    public static void main(string[] args)
    {
        RuntimeHelpers.RunClassConstructor(ObjectImpl);
        List list = new ArrayList();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        System.@out.println(list);
        try
        {
            operation1();
        }
        catch (Exception exception1)
        {
            ThrowableWrapper.wrapThrowable(exception1).printStackTrace();
        }
        operation2();
        Utilities.cleanupAfterMainReturns();
    }

    [JavaThrownExceptions("1;java/lang/CloneNotSupportedException;"), JavaFlags(0x408005)]
    public override object MemberwiseClone()
    {
        ObjectImpl.clone(this);
        return base.MemberwiseClone();
    }

    [JavaThrownExceptions("1;java/lang/Exception;")]
    public static void operation1()
    {
        throw new Exception();
    }

    public static void operation2()
    {
        throw new RuntimeException();
    }

    [JavaFlags(0x408001)]
    public override string ToString()
    {
        return ObjectImpl.jloToString(this);
    }
}

... da lag ich mit meiner Idee also gar nicht sooooo daneben ;-)

Gruß Tom
 
Diese Unterstützung gibt es auch aus gutem Grund nicht in C# und VB.NET. J# ist an dieser Stelle quasi anders zu beurteilen.

Ich selbst kenne nur Java, welches Checked Exceptions implementiert und das nicht wirklich sauber. C# und VB.NET implementieren es erst gar nicht, solange es dafür keinen wirklich guten Weg gibt.

Warum das für .NET so entschieden wurde, kann man unter folgendem Link nachlesen:
http://www.artima.com/intv/handcuffs.html
(Lockeres Gespräch zwischen Bruce Eckel und Anders Hejlsberg)
 
Hallo,

ich kenne diesen Artikel sehr gut ;-)
Jedoch denke ich das einige Argumente darin nicht wirklich überzeugen...
Wenn beispielsweise Argumentiert wird, dass man bei Checked Exceptions die in einer Methodensignatur deklariert sind bei der Weiterentwicklung dieser Methode Probleme bekommen kann wenn man eine weitere Exception deklariert der "alte" API Verwender dann die neue API nicht mehr verwenden kann, da dieser nicht auf die neue Ausnahme reagiert...
Dieses Argument ist IMHO etwas Fadenscheinig, da bei anderen Änderungen wie etwa anderer Rückgabetyp, Änderungen des Methodennamens, neue Parameter / andere Typen etc. das gleiche passiert... (API Verwender muss die Änderungen nachziehen).

Das mal nur als Beispiel...
Bruce Eckel ist ein genialer Ingenieur, aber das heißt noch Lange nicht dass er mit allem recht hat ;-)

Ich denke "früher" wurden in anderen Programmiersprachen mit Unterstützung für Checked Exceptions zu viele Checked Exceptions verwendet... über die Verwendung von Checked und Unchecked Exceptions hab ich hier: http://www.tutorials.de/forum/java/268698-programmierstil-exceptions.html mal ausgelassen.

Ich denke es wäre sehr hilfreich auch in C# zumindest die Möglichkeit zu haben Checked Exceptions zu verwenden.
Die Fähigkeit vom Compiler auf nicht behandelte Exceptions (die man aber sinnvoll Behandeln könnte) aufmerksam gemacht zu werden ist in der Regel sehr nützlich.

Gruß Tom
 
Ich meinte hier vielmehr auch eher die Aussagen von Anders Hejlsberg :)

Ich persönlich finde Checked Exceptions ja auch praktisch. Aber es hängt eben von der Implementierung derselben ab. Und in Java ist es laut den wirklichen Experten nicht sauber gelöst und zum Großteil auch nachvollziehbar warum. Darum gibt es sie in zB C# auch gar nicht.

Wie gesagt, ich finde sie nicht schlecht, aber es können daraus einige Probleme entstehen und diese sollten gelöst werden bevor es eine entsprechende Implementierung gibt.
 
Zurück