10

Principalmente capisco i potenziali problemi con le eccezioni controllate e perché Kotlin li omette. Tuttavia, il problema che sto incontrando è che non riesco a trovare alcun modo infallibile per indicare chiaramente al chiamante quali eccezioni può essere lanciata da una funzione.C'è un modo semplice per vedere quali eccezioni si verificano in una funzione di Kotlin?

Mi sono imbattuto nel numero innumerevole di volte in Python dove il mio programma si arresterà inaspettatamente dopo essere stato in esecuzione per mesi perché non mi ero reso conto che una funzione da qualche libreria che sto usando può sollevare una particolare eccezione. Sebbene essere costretti a rilevare eccezioni può essere piuttosto problematico, è bello vedere chiaramente tutte le potenziali eccezioni che una funzione può generare.

Quindi, tornando alla domanda, c'è un modo semplice per vedere quali eccezioni una funzione genera in Kotlin? Che dire dei metodi scritti in Java che vengono chiamati da Kotlin? Anche se solo in tooling (intelliJ). Non sto contando di scriverlo in javadoc o kdoc in quanto lo scrittore della funzione che stai usando potrebbe averlo omesso.

+0

Suppongo che sia impossibile. Considera quanto segue: 'val cls = Class.forName (a); val method = cls.getMethod (b); method.invoke() ', dove' a' e 'b' vengono letti dal file o forniti dall'input dell'utente. Come puoi sapere quali eccezioni questo codice genera prima di eseguire il codice? –

+1

Voglio dire che ti mancheranno tutti i tipi di informazioni sul tipo quando usi la riflessione. Non si potrebbero applicare gli stessi problemi se si stesse utilizzando il reflection in Java? Penso che sarebbe ancora utile sapere quali eccezioni possono essere lanciate nei casi in cui il tipo è noto in fase di compilazione. – zjuhasz

risposta

4

Se si desidera conoscere le eccezioni generate da un metodo Java quando chiamato da Kotlin da IntelliJ, è possibile utilizzare il tasto di scelta rapida F1 per aprire la javadoc e visualizzare la dichiarazione dei lanci nel menu popup.

Le funzioni di Kotlin possono dichiarare eccezioni che vengono generate utilizzando l'annotazione. Le annotazioni sono ovviamente facoltative, quindi probabilmente non puoi aspettarti che esista sempre. Sfortunatamente, quando usi la scorciatoia da tastiera F1 su un metodo usando @Throws, non mostra le eccezioni dichiarate per essere lanciate. Le chiamate Java in questi metodi sono necessarie per intercettare queste eccezioni dichiarate nell'annotazione.

Kotlin javadoc può utilizzare l'annotazione @throws javadoc per fornire ulteriori eccezioni di definizione che possono essere generate in una funzione. Questi appaiono in javadoc e nei popup della guida di F1. Ovviamente anche questo è opzionale.

+1

Javadoc è una buona soluzione per il mio codice ma il problema è che javadoc in molte librerie lascia molto a desiderare e si sta davvero contando sullo sviluppatore per avere una documentazione completa su tutto. Immagino che stavo cercando qualcosa di simile a un avvertimento in intelliJ o un altro strumento in cui non avrei dovuto controllare manualmente nulla in modo da non perdere per errore un'eccezione da una funzione di libreria che non è ovvia. Sembra che una cosa del genere non esista finora:/ – zjuhasz

+1

Sì, è un po 'il modo in cui funzionano le eccezioni non controllate. Conosco il tuo dolore –

+1

Tasto F1? Scrivere meglio sul nome dell'azione IntelliJ, non sul collegamento che può essere rimappato. Non funziona per me. –

0

Questa libreria denominata Result è una soluzione piacevole. Restituisce un oggetto risultato con un valore o un'eccezione e ne modifica il tipo in caso di successo o fallimento di conseguenza. Possono anche essere concatenati usando la mappa delle librerie e le funzioni di mappa piatta che aiutano a eliminare i blocchi di catch catch annidati. Molto bello, raccomando a chiunque trovi questa domanda di verificarlo.

Ovviamente questo aiuta solo con le funzioni che ne traggono vantaggio, quindi non sto contrassegnando questo come una risposta.