PDA

View Full Version : [JAVA] Gestione exceptions in ubuntu e windows


pippopamp
10-12-2008, 11:31
Salve a tutti, ho un piccolo problemino con una applicazione Java che ho scritto sotto wondows e che ora, in nome della portabilità di Java, voglio eseguire sotto ubuntu.

L'applicazione in se funziona bene, tranne che per la gestione delle eccezioni.
Es. Se ho System.exit(-1), ottengo i due seguenti output:

--->Windows: Java Result: -1
--->Ubuntu: Java Result: 255

Oppure, con System.exit(-1976), ottengo:

--->Windows: Java Result: -1976
--->Ubuntu: Java Result: 72

Sarà una domanda banale, ma non riesco a capire che cosa combina?!? E' come se gestisse correttamente solo i codici di eccezione tra 0 e 255.

Mi potete dire se e come è possibile risolvere il problema senza essere costretto a combiare tutti i codici di errore?

Oceans11
10-12-2008, 11:45
Sono andato a cercare tra la documentazione ma non ho trovato niente a riguardo, non saprei come aiutarti.

Ma come mai usi valori negativi??scusa che senso ha?qual'è la comodità?

pippopamp
10-12-2008, 12:05
Sono andato a cercare tra la documentazione ma non ho trovato niente a riguardo, non saprei come aiutarti.

Ma come mai usi valori negativi??scusa che senso ha?qual'è la comodità?

Generalmente è solito utilizzare dei valori negativi per indicare un terminazione con errore di un programma o cmq una terminazione inattesa. I codici positivi, invece, vengono usati per chiusure corrette del programma.

Ho notato che anche usando valori positivi, se vado oltre 255, sotto linux mi viene visualizzato il codice in modulo 255. :muro:

Oceans11
10-12-2008, 12:19
Generalmente è solito utilizzare dei valori negativi per indicare un terminazione con errore di un programma o cmq una terminazione inattesa. I codici positivi, invece, vengono usati per chiusure corrette del programma.

In java non è così. 0 indica chiusura corretta, un numero diverso da zero una terminazione inattesa o di errore. Ecco il riferimento (http://java.sun.com/javase/6/docs/api/java/lang/System.html#exit(int))

banryu79
10-12-2008, 12:53
Credo che il significato dei codici di uscita di un processo sia strettamente legato alle convenzioni del sistema operativo in cui ci si trova.

Detto questo però mi fa strano sapere che se chiamo System.exit() con argomento -1 sotto Ubuntu mi converta il codice di uscita... Non lo sapevo, magari qualcuno esperto di s.o. sa perchè (non vorrei dire frescacce ma potrebbe essere la JVM che dietro le quinte fa quella conversione sulla base del s.o. sottostante)

pippopamp
10-12-2008, 13:54
Credo che il significato dei codici di uscita di un processo sia strettamente legato alle convenzioni del sistema operativo in cui ci si trova.

Detto questo però mi fa strano sapere che se chiamo System.exit() con argomento -1 sotto Ubuntu mi converta il codice di uscita... Non lo sapevo, magari qualcuno esperto di s.o. sa perchè (non vorrei dire frescacce ma potrebbe essere la JVM che dietro le quinte fa quella conversione sulla base del s.o. sottostante)

Ma infatti il problema di fondo è quello! A me non interessa dover usare codici di errore positivi o negativi nel system.exit(). Il problema che se io assegno ad un errore il codice 258 e poi in uscita mi dice che il programma è uscito con codice errore 2, è un pastrocchio (!?) perchè potrei scambiare l'errore 258 con un altro (il 2 in questo caso).

Inoltre se impongo sotto linux come codice di uscita 256 => Ottengo un bel System.exit(0), cioè mi dice che il programma è uscito correttamente, ma ciò non è assolutamente vero!

Potrebbe anche trattarsi di una dimenticanza dei progettisti dell Sun verso linux, ma non credo sia così vista l'attenzione che sun dedica all'open source.

Oceans11
10-12-2008, 15:17
Inoltre se impongo sotto linux come codice di uscita 256 => Ottengo un bel System.exit(0), cioè mi dice che il programma è uscito correttamente, ma ciò non è assolutamente vero!

Ok questo sì che è un problema...:D però ripeto, non so aiutarti

Caldwell83
10-12-2008, 16:03
Non vorrei dire castronerie, ma credo che sia una limitazione della shell unix.

Facendo un semplicissimo script che esce con -1 il risultato è questo:


sh-2.05b$ cat prova.sh
#!/bin/sh
echo "Ciao"
exit -10
sh-2.05b$ ./prova.sh
Ciao
sh-2.05b$ echo $?
246
sh-2.05b$


Anche un altro utente ha il tuo stesso problema http://www.hwupgrade.it/forum/showthread.php?t=1881327

Io ho internet filtrato, quindi non posso fare ricerche piu' approfondite.

banryu79
10-12-2008, 16:25
Mmm... qua ci vorrebbe una risposta da ilsensine, ma è da parecchio che non lo vedo postare.

pippopamp
10-12-2008, 17:22
Ho trovato questo articolo:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4680945

Sembra che il problema sia segnalato e irrisolto dal lontato 2002.

Si riporta infatti che:
"Can't be fixed, since we can distinguish processes returning
-1 and 255 on Linux."

banryu79
10-12-2008, 17:47
Ho trovato questo articolo:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4680945

Sembra che il problema sia segnalato e irrisolto dal lontato 2002.

Si riporta infatti che:
"Can't be fixed, since we can distinguish processes returning
-1 and 255 on Linux."
Da quell'articolo si nota che c'è un "workaround" (se così lo possiamo chiamare):

CUSTOMER WORKAROUND :
The problem occurs when the exit code is larger than 127. If
one can avoid using values within the "problematic" range,
there's no harm.


Non ti resta che restituire codici di errore compresi nel range 0...127

malocchio
10-12-2008, 23:20
Penso che ci possa venire in aiuto il file stdlib.h (rif. /usr/include/stdlib.h)

/* We define these the same for all machines.
Changes from this to the outside world should be done in `_exit'. */
#define EXIT_FAILURE 1 /* Failing exit status. */
#define EXIT_SUCCESS 0 /* Successful exit status. */

extern void exit (int __status) __THROW __attribute__ ((__noreturn__));

Sinceramente mi sarei aspettato di vedere come parametro un unsigned char, visto il comportamento osservato. Probabilmente in Linux l'exit value viene memorizzato in soli 8 bit.

Da notare che lo standard è 0 = successo, 1 = fallimento.

Penso che per esiti negativi di exit si possano usare anche altri codici, ma solamente positivi

meh