10

Ich verstehe meist die möglichen Probleme mit geprüften Ausnahmen und warum Kotlin sie auslässt. Das Problem, auf das ich stoße, ist jedoch, dass ich keinen narrensicheren Weg finden kann, dem Anrufer deutlich zu zeigen, welche Ausnahmen eine Funktion auslösen kann.Gibt es eine einfache Möglichkeit zu sehen, welche Ausnahmen eine Kotlin-Funktion auslöst?

Ich habe unzählige Male in Python auf das Problem gestoßen, wo mein Programm nach monatelangem Programmabsturz abstürzt, weil ich nicht erkannte, dass eine Funktion aus einer Bibliothek, die ich verwende, eine bestimmte Ausnahme auslösen kann. Obwohl das Abfangen von Ausnahmen sehr problematisch sein kann, ist es schön, alle möglichen Ausnahmen zu sehen, die eine Funktion auslösen kann.

Also zurück zur Frage, gibt es eine einfache Möglichkeit zu sehen, welche Ausnahmen eine Funktion in Kotlin wirft? Was ist mit Methoden in Java geschrieben, die von Kotlin aufgerufen werden? Auch wenn nur im Werkzeugbau (intelliJ). Ich zähle nicht, es in javadoc oder kdoc zu schreiben, da der Schreiber der Funktion, die Sie verwenden, es möglicherweise weggelassen hat.

+0

Ich nehme an, es ist unmöglich. Berücksichtigen Sie Folgendes: 'val cls = Class.forName (a); val Methode = cls.getMethod (b); method.invoke() ', wobei' a' und 'b' aus Datei gelesen oder durch Benutzereingaben bereitgestellt werden. Wie können Sie wissen, welche Ausnahmen dieser Code auslöst, bevor Sie den Code ausführen? –

+1

Ich meine, du wirst alle Arten von Typinformationen vermissen, wenn du Reflektionen verwendest. Wären nicht die gleichen Probleme, wenn Sie Reflektion in Java verwenden würden? Ich denke, es wäre immer noch nützlich zu wissen, welche Ausnahmen in den Fällen ausgelöst werden können, in denen der Typ zum Zeitpunkt der Kompilierung bekannt ist. – zjuhasz

Antwort

4

Wenn Sie wissen möchten, welche Ausnahmen eine Java-Methode auslöst, wenn sie von Kotlin aus IntelliJ aufgerufen wird, können Sie mit der F1-Tastenkombination das Javadoc aufrufen und die throws-Deklaration im Popup-Menü anzeigen.

Kotlin-Funktionen können Ausnahmen deklarieren, die mit der @Throws-Annotation ausgelöst werden. Anmerkungen sind offensichtlich optional, daher können Sie nicht erwarten, dass dies immer existiert. Wenn Sie die Tastenkombination F1 für eine Methode verwenden, die @Throws verwendet, werden leider nicht die Ausnahmen angezeigt, die für das Auslösen deklariert wurden. Java-Aufrufe in diese Methoden sind erforderlich, um diese in der Annotation deklarierten Ausnahmen abzufangen.

Kotlin javadoc kann die javadoc-Annotation @throws verwenden, um weitere Definitionsausnahmen bereitzustellen, die in einer Funktion ausgelöst werden können. Diese erscheinen in Javadoc und in F1-Hilfe-Popups. Natürlich ist dies auch optional.

+1

Javadoc ist eine gute Lösung für meinen eigenen Code, aber das Problem ist das Javadoc in vielen Bibliotheken lässt viel zu wünschen übrig und Sie zählen wirklich auf den Entwickler, um eine gründliche Dokumentation über alles zu haben. Ich glaube, ich suchte eher nach etwas wie einer Warnung intelliJ oder einem anderen Werkzeug, wo ich nichts manuell überprüfen müsste, damit ich nicht versehentlich eine Ausnahme von einer Bibliotheksfunktion verpasse, die nicht offensichtlich ist. Es sieht so aus, als ob so etwas noch nicht existiert:/ – zjuhasz

+1

Ja, das ist die Art, wie unkontrollierte Ausnahmen funktionieren. Ich kenne deinen Schmerz. –

+1

F1-Taste? Schreiben Sie besser über den Namen der IntelliJ-Aktion, nicht über die Verknüpfung, die neu zugeordnet werden kann. Funktioniert nicht für mich. –

0

Diese Bibliothek namens Result ist eine nette Lösung. Es gibt ein Result-Objekt mit einem Wert oder einer Ausnahme zurück und ändert seinen Typ entsprechend in Erfolg oder Fehler. Sie können auch miteinander verkettet werden, indem die Bibliotheken map- und flatmap-Funktionen verwendet werden, wodurch verschachtelte try-catch-Blöcke eliminiert werden. Sehr cool, ich empfehle jedem, der diese Frage findet, es auszuprobieren.

Natürlich hilft das nur mit Funktionen, die es ausnutzen, also markiere ich das nicht als Antwort.

Verwandte Themen