Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra integra un sensore da 1 pollice 8K, ottiche Leica e triplo chip IA. Tra schermo OLED rimovibile, workflow I-Log a 10 bit e stabilizzazione a tre assi, analizziamo le doti tecniche di una gimbal camera pensata per i professionisti
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 09-06-2010, 14:41   #1
tylerdurden83
Senior Member
 
Iscritto dal: Nov 2004
Messaggi: 691
[JAVA] Strano comportamento Try-Catch-Finally

Posto un estratto di codice:

Codice:
try {
    ...
    fs = new FileInputStream(this.resource.getResourceFile());
    ...
    while (this.isActive==true) {
        if ((line = input.readLine()) != null) {
      	try {
                 ...
                 this.persist(parsable);
                 ...
                 this.sendJMSMessage((JMSPublishable)parsable);
                 ...
                 continue;
             } catch (Exception e) {
        	    logger.error("Si e' verificata una eccezione durante la persist o la sendJMS del seguente messaggio: "+line, e);
             }
             Thread.sleep(1000L);
             ...
       }
       ...
    }
} catch (SAXException x) {
    logger.error("SAXException while creating the PatternMatchingHandler",x);
} catch (ParserConfigurationException x) {
    logger.error("ParserConfigurationException while creating the PatternMatchingHandler",x);
} catch (InterruptedException x) {
    logger.error("The thread has been interrupted",x);
} catch (FileNotFoundException fnf){
    logger.error("A FileNotFoundException has been raised. It could be a temporary log being destroyed",fnf);
    this.isActive = false;
} catch (IOException ioe) {
    logger.error("A generic IOException has been raised",ioe);
} catch (Exception e) {
    logger.error("Failsafe generic Exception catching",e);
} finally {
    try {
        // clean everything
        ...
        if(fs!=null){fs.close();}                
    } catch (Exception e) {
        logger.error("Some cleaning up in the finally block didn't work",e);
    }
    if (this.isActive==true){
        logger.fatal("A fatal exception has been caught, the whole process is about to be killed");
        System.exit(1);
    } else {
        logger.warn("The thread is about to die. This could be normal in case of a thread running on a temporary log");
    }
}
e il log che ne è uscito fuori:

Quote:
21:13:57,827 [pool-1-thread-7] [FATAL] implementation.LogTibcoEaimmReader - A fatal exception has been caught, the whole process is about to be killed
In pratica, il controllo è uscito dal

Codice:
while (this.isActive==true)
sebbene la print successiva confermi che

Codice:
this.isActive==true
di conseguenza deve esserci stata una exception, eppure nessuna checked exception esplicitamente catturata ha stampato il proprio messaggio (SAXException, ParserConfigurationException, InterruptedException, FileNotFoundException, IOException ioe). Ci potrei anche stare, magari ho preso qualche nullpointer o unchecked runtime exception, tuttavia in coda alle varie checked exception c'è anche una:

Codice:
} catch (Exception e) {
    logger.error("Failsafe generic Exception catching",e);
} finally {
   ....
e manco questa è stata stampata...eppure nel finally c'è entrato...come potrebbe succedere una cosa del genere?

Grazie a tutti per l'aiuto,
TD
tylerdurden83 è offline   Rispondi citando il messaggio o parte di esso
Old 09-06-2010, 15:10   #2
lupoxxx87
Senior Member
 
Iscritto dal: Jul 2009
Città: Varès
Messaggi: 658
beh ma la finally viene eseguita anche se entra in uno dei blocchi catch... non è come il default di uno switch che viene eseguito solo se non intercettato prima.

dovresti controllare nel logger.error per capire quale eccezione è stata lanciata...
oppure mettere una print dell'eccezione nello stesso if che ti da la stampa che riscontri.

l'unica cosa che è sicura è che viene lanciata un eccezione durante l'attività dell'oggetto...
__________________
Quote:
Originariamente inviato da piccolino Guarda i messaggi
l'html si può considerare benissimo un linguaggio di programmazione web. se vogliamo dirla tutta anche css... è come programmare in c++
lupoxxx87 è offline   Rispondi citando il messaggio o parte di esso
Old 09-06-2010, 15:28   #3
tylerdurden83
Senior Member
 
Iscritto dal: Nov 2004
Messaggi: 691
Quote:
Originariamente inviato da lupoxxx87 Guarda i messaggi
beh ma la finally viene eseguita anche se entra in uno dei blocchi catch... non è come il default di uno switch che viene eseguito solo se non intercettato prima.

dovresti controllare nel logger.error per capire quale eccezione è stata lanciata...
oppure mettere una print dell'eccezione nello stesso if che ti da la stampa che riscontri.

l'unica cosa che è sicura è che viene lanciata un eccezione durante l'attività dell'oggetto...
Ho capito, ma infatti è quello che non mi torna, come può essere lanciata una eccezione se:

Codice:
} catch (Exception e) {
    logger.error("Failsafe generic Exception catching",e);
} finally {
   ....
nel log trovo la print dentro la finally, ma nessuna delle print dentro le catch... L'unica entry nel log è quella della finally, nient'altro... Ah, log4j ovviamente è configurato per stampare da INFO in sù (e lo fa, ho controllato), quindi error non viene filtrato. Per completezza ecco il file di log4j:

Quote:
log4j.rootLogger=INFO, rootAppender
log4j.appender.rootAppender=org.apache.log4j.DailyRollingFileAppender
log4j.appender.rootAppender.Append=false
log4j.appender.rootAppender.File=test.log
log4j.appender.rootAppender.threshold=TRACE
log4j.appender.rootAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.rootAppender.layout.ConversionPattern=%d{ABSOLUTE} [%t] [%-5p] %C{2} %x - %m%n
log4j.logger.monitoraggiov4=INFO
La print:

Quote:
21:13:57,827 [pool-1-thread-7] [FATAL] implementation.LogTibcoEaimmReader - A fatal exception has been caught, the whole process is about to be killed
contiene come specificato dal pattern log4j gli ultimi 2 campi del fully qualified class name, implementation.LogTibcoEaimmReader, un package sotto monitoraggioV4 (espressamente settato a INFO in log4j attualmente)
tylerdurden83 è offline   Rispondi citando il messaggio o parte di esso
Old 10-06-2010, 21:44   #4
tylerdurden83
Senior Member
 
Iscritto dal: Nov 2004
Messaggi: 691
bumpino....
tylerdurden83 è offline   Rispondi citando il messaggio o parte di esso
Old 10-06-2010, 22:51   #5
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Prova a rilanciare ogni eccezione catturata nelle varie clausole catch per vedere quale sia quella che effettivamente viene sollevata (e che non viene loggata?) e/o stampala sullo standard output.

2 Domande banali:
1. dove viene settato a false isActive?
2. c'è solo un thread che accede in scrittura a isActive?
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 10-06-2010, 23:54   #6
tylerdurden83
Senior Member
 
Iscritto dal: Nov 2004
Messaggi: 691
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Prova a rilanciare ogni eccezione catturata nelle varie clausole catch per vedere quale sia quella che effettivamente viene sollevata (e che non viene loggata?) e/o stampala sullo standard output.

2 Domande banali:
1. dove viene settato a false isActive?
2. c'è solo un thread che accede in scrittura a isActive?
isActive non viene modoficata da nessuno al momento, ho rimosso la parte che la manipolava x ora. Domani provo quello che mi consigli
tylerdurden83 è offline   Rispondi citando il messaggio o parte di esso
Old 11-06-2010, 10:07   #7
tylerdurden83
Senior Member
 
Iscritto dal: Nov 2004
Messaggi: 691
Ieri sera ero un po rinco...

isActive effettivamente non viene mai modificato.

Per quanto riguarda la storia delle print ho pensato che, se entra dentro catch (Exception e), e prova a stamparla ma questa è per qualche motivo null (return nel blocco finally di un metodo precedente?), allora avrei una nullpointerexception che mi fa andare dritto nel finally, giusto?

Ora provo il tuo consiglio dei throw, intanto ieri ho messo delle print senza stampare anche il throwable subito prima di quelle che stampano anche il throwable, queste print di solo testo non possono in alcun modo fallire penso, quindi almeno una dovrebbe comparire...
tylerdurden83 è offline   Rispondi citando il messaggio o parte di esso
Old 15-06-2010, 10:24   #8
tylerdurden83
Senior Member
 
Iscritto dal: Nov 2004
Messaggi: 691
Nuovo tentativo...

Codice:
try {
    ...
    while (true) {
        ...
        super.persist(parsable);
        super.sendJMSMessage((JMSPublishable)parsable);
        ...
    }
} catch (SAXException x) {
    super.logger.fatal("SAXException");
    super.logger.error("SAXException while creating the PatternMatchingHandler",x);
} catch (ParserConfigurationException x) {
    super.logger.fatal("ParserConfigurationException");
    super.logger.error("ParserConfigurationException while creating the PatternMatchingHandler",x);
} catch (InterruptedException x) {
    super.logger.fatal("InterruptedException");
    super.logger.error("The thread has been interrupted",x);
} catch (FileNotFoundException fnf){
    super.logger.fatal("FileNotFoundException");
    super.logger.error("A FileNotFoundException has been raised. It could be a temporary log being destroyed",fnf);
} catch (IOException ioe) {
    super.logger.fatal("IOException");
    super.logger.error("A generic IOException has been raised",ioe);
} catch (Exception e) {
    super.logger.fatal("Exception");
    super.logger.error("Failsafe generic Exception catching",e);
} finally {
    try {
        super.cleanUp();
        if(input!=null){input.close();}
        if(fileReader!=null){fileReader.close();}
        if(fs!=null){fs.close();}                
    } catch (Exception e) {
        super.logger.fatal("Exception nel finally()");
        super.logger.error("Some cleaning up in the finally block didn't work",e);
    }
    super.logger.fatal("A fatal exception has been caught, the whole process is about to be killed");
    System.exit(1);
}
Log:

Quote:
...
16:35:13,235 [pool-1-thread-7] [FATAL] implementation.LogTibcoEaimmReader - A fatal exception has been caught, the whole process is about to be killed
Ulteriori verifiche nel file di log:

Quote:
cat test.log_20100614 | grep FATAL
16:35:13,235 [pool-1-thread-7] [FATAL] implementation.LogTibcoEaimmReader - A fatal exception has been caught, the whole process is about to be killed

tail -100 test.log_20100614 | grep ERROR
nessuna entry...
Scusa se non ho ancora provato a rilanciarla ma queste catch sono dentro un metodo run di Runnable.
tylerdurden83 è offline   Rispondi citando il messaggio o parte di esso
Old 15-06-2010, 12:13   #9
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Temo di essermi perso qualcosa:
Codice:
finally {
    ...
    super.logger.fatal("A fatal exception has been caught, the whole process is about to be killed");
    System.exit(1);
}
Perchè scrivi sempre questa entry nel log? E uccidi la vm?
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 15-06-2010, 12:26   #10
Kenger
Member
 
Iscritto dal: Aug 2005
Messaggi: 168
Non ho capito una cosa... Ti è chiaro il fatto che il programma entra sempre nella finally, sia che ci sia un'eccezione sia che non ci sia?
Kenger è offline   Rispondi citando il messaggio o parte di esso
Old 15-06-2010, 16:04   #11
tylerdurden83
Senior Member
 
Iscritto dal: Nov 2004
Messaggi: 691
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Temo di essermi perso qualcosa:
Codice:
finally {
    ...
    super.logger.fatal("A fatal exception has been caught, the whole process is about to be killed");
    System.exit(1);
}
Perchè scrivi sempre questa entry nel log? E uccidi la vm?
Non ho capito cosa intendi sul perchè la scrivo nel log, ti dico perchè uccido la virtual machine. In teoria il thread sta in while(true), non dovrebbe mai smettere di lavorare. Qualora venga presa una di quelle eccezioni (ci sono try catch piu interni per gestire eccezioni in altri punti) il thread deve terminare. In più, invece di avere un thread "worker" in meno e far proseguire l'applicazione con gli altri, viene attualmente preferito far crashare l'applicazione e farla ripartire in automatico.

Ultima modifica di tylerdurden83 : 15-06-2010 alle 16:07.
tylerdurden83 è offline   Rispondi citando il messaggio o parte di esso
Old 15-06-2010, 16:06   #12
tylerdurden83
Senior Member
 
Iscritto dal: Nov 2004
Messaggi: 691
Quote:
Originariamente inviato da Kenger Guarda i messaggi
Non ho capito una cosa... Ti è chiaro il fatto che il programma entra sempre nella finally, sia che ci sia un'eccezione sia che non ci sia?
Certo che mi è chiaro, quello che non mi è chiaro è come possa succedere che

Codice:
try{
    while(true){
        doStuff();
    }
} catch (Exception e){
    stampa("Eccezione!");
} finally{
    stampa("Finally chiamato");
}
Un codice del genere possa stamparmi nel log solo
Quote:
"Finally chiamato"
e non
Quote:
"Eccezione!"
"Finally chiamato"

Ultima modifica di tylerdurden83 : 15-06-2010 alle 16:08.
tylerdurden83 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema Insta360 Luna Ultra: la potenza del sensore da 1...
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
HillMiles MileCity1 torna a 648,99€: e-b...
Enel Mobile, il debutto è sempre ...
Nuova rimodulazione per il fisso di TIM ...
iPhone 18 Pro e Pro Max, preordini sotto...
Ha craccato 26 giochi: ora Denuvo vuole ...
Xiaomi 18 Pro, il lancio è uffici...
Spotify introduce una nuova impostazione...
007 First Light introduce il path tracin...
Apple amplia iCloud+ e include Apple TV ...
IA e lavoro, non ci sono solo cattive no...
Antenne 5G e campo elettromagnetico: la ...
HONOR Watch 6 torna in offerta a 169,90 ...
Tutte le offerte Amazon di oggi: Google ...
Diesel alle stelle e benzina in rialzo: ...
Un bambino di 9 anni clicca su 'Promuovi...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 14:32.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v