2016-06-08 42 views
7

Attualmente eseguo il wrapping di una libreria C in Java, semplificando l'utilizzo e il lavoro con la programmazione OO. La libreria C utilizza i codici di errore (int return value) e Out-Parameter per la manipolazione dei dati. Non sono necessariamente un fan dei codici di errore, quindi mi piacerebbe creare alcune classi di eccezioni personalizzate che posso lanciare se la mia libreria rileva un codice di errore diverso da "successo".Ci sono molte eccezioni in Bad design in Java?

L'unico problema è che la quantità di eccezioni che potrebbero essere generate da ogni singolo metodo è molto alta (ci sono alcuni codici di errore che possono essere restituiti da ogni funzione della libreria C, come "Device_Not_Connected"). È passato un po 'di tempo dall'ultima volta che ho programmato in Java, quindi non so davvero quale sia la situazione con Exceptions in Java.

  1. I metodi che generano molte eccezioni differenti design errato?
  2. Devo gestire le eccezioni o esiste un modo per ignorarlo semplicemente?
  3. Se riesco a ignorare un'eccezione, fa esplodere l'albero delle chiamate (ad esempio in Python)?
  4. Esistono alternative alle eccezioni in Java oltre ai codici di errore e ai no-op?
+0

Una buona regola generale è di aver controllato eccezioni per una condizione che il chiamante può recuperare. – nickb

risposta

3

Sono metodi che generano molte eccezioni diverse?

Se usato chiaramente no! Un'eccezione è fondamentalmente solo un possibile stato di ritorno che non rientra nello scopo tecnico del metodo. Per esempio. se il metodo deve leggere un valore da un dispositivo null o qualsiasi valore deve essere restituito utilizzando il tipo restituito. Ma lanciare una DeviceNotConnectedException personalizzata per dichiarare che qualcosa è andato storto quando non si è in grado di leggere un valore di ritorno invece di semplicemente returnung null è una best practice del 100%. E se 10 cose possono andare storte, allora va bene dichiarare 10 possibili eccezioni.

Devo gestire le eccezioni oppure esiste un modo per ignorarlo semplicemente?

Quando non si cattura un'eccezione si dovrà dichiarare il metodo che si verifica con "myMethod public void() tiri MyExcp {..}" e così via in ogni metodo di chiamare questo metodo, che il metodo chiamante e così via. Se lo passi al metodo principale e non viene gestito lì, il programma si bloccherà.

Se riesco a ignorare un'eccezione, fa apparire il call tree (ad esempio in Python)?

Vedere sopra.

Esistono alternative alle eccezioni in Java oltre ai codici di errore e ai no-op?

Non per quanto ne so ma non sono un esperto.

+2

Se si estende RuntimeException, non dovranno essere dichiarati esplicitamente nella firma del metodo e automaticamente saliranno in bolla nella catena di chiamate. IMO, RuntimeExceptions sono preferibili a quelli controllati tranne che per eccezioni che possono essere recuperate in modo significativo. – marthursson

+0

@marthursson Era esattamente quello che stavo cercando! –

+1

@marthursson la tua opinione -> ["Ecco la linea di massima: se un cliente può ragionevolmente aspettarsi di recuperare da un'eccezione, rendi un'eccezione controllata. Se un client non può fare nulla per recuperare dall'eccezione, impostalo come non selezionato eccezione. "] (https://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html) –

2

Si dovrebbe assolutamente lanciare un'eccezione se qualcosa va storto che è collegato a IO (file, dispositivi, input dell'utente). Non è necessario definire una classe di eccezione diversa per tutti i diversi codici di errore.Se la gestione dei codici di errore è abbastanza simile, è possibile utilizzare la stessa eccezione, come

throw new IOException("Device not connected"); 

Se possibile, si dovrebbe evitare di buttare in giro troppe eccezioni che sono collegati a parametri errati ecc Stabilire le funzioni di controllo per la utente (come "containsKey") in modo tale che non sia necessario "provare a catturare" tali cose.

+0

Non sono davvero in grado di convalidare i parametri in anticipo, come dipende dallo stato se il dispositivo comunica con la libreria C. Non è proprio l'API più intuitiva che abbia mai visto :) –

1

È possibile creare una gerarchia di ereditarietà per le classi di eccezione, in modo che la firma di un metodo definisca una [sola eccezione] generale di eccezione del metodo, indipendentemente da quante eccezioni specifiche si gettano nel corpo del metodo.

public void myMethod() throws MyGeneralException { 
    ... 

    throw new MySpecific1Exception(); 
    ..... 

    throw new MySpecific2Exception(); 

} 

I chiamanti avranno la libertà di scelta di gestire eccezioni specifiche o quelle generali.

Opzione 1:

try { 
    myMethod(); 
} catch (MyGeneralException e) { 
    .... 
} 

Opzione 2:

try { 
    myMethod(); 
} catch (MySpecific1Exception e) { 
.... 
} catch (MySpecific2Exception e) { 
.... 
} 
+0

Ho pensato che funzionasse solo il contrario? Rilevare eccezioni derivate con una clausola di eccezione di eccezione di base? –

+1

Ho aggiunto un esempio. Spero sia chiaro ora – adranale

+0

A volte sono impressionato da Java, almeno dopo aver programmato C++ per un po '! –

Problemi correlati