Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco
Deebot X11 Omnicyclone implementa tutte le ultime tecnologie Ecovacs per l'aspirazione dei pavimenti di casa e il loro lavaggio, con una novità: nella base di ricarica non c'è più il sacchetto di raccolta dello sporco, sostituito da un aspirapolvere ciclonico che accumula tutto in un contenitore rigido
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio
Grazie ad un mocio rotante che viene costantemente bagnato e pulito, Narwal Flow assicura un completo e capillare lavaggio dei pavimenti di casa. La logica di intellignza artificiale integrata guida nella pulizia tra i diversi locali, sfruttando un motore di aspirazione molto potente e un sistema basculante per la spazzola molto efficace sui tappeti di casa
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi
Con un prezzo di 2.999 euro, il Panasonic Z95BEG entra nella fascia ultra-premium dei TV OLED: pannello Primary RGB Tandem, sistema di raffreddamento ThermalFlow, audio Technics integrato e funzioni gaming avanzate lo pongono come un punto di riferimento
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


Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco Ecovacs Deebot X11 Omnicyclone: niente più...
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio Narwal Flow: con il mocio orizzontale lava i pav...
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi Panasonic 55Z95BEG cala gli assi: pannello Tande...
HONOR Magic V5: il pieghevole ultra sottile e completo! La recensione HONOR Magic V5: il pieghevole ultra sottile e co...
Recensione Google Pixel 10 Pro XL: uno zoom 100x assurdo sempre in tasca (e molto altro) Recensione Google Pixel 10 Pro XL: uno zoom 100x...
Arrivano le eSIM per iliadbusiness, l'of...
iPhone 17 e 17 Pro senza SIM fisica: non...
Hollow Knight: Silksong, primo record sp...
Public VCF as-a-Service, il nuovo serviz...
GAC annuncia il suo ingresso in Europa: ...
Un rene di maiale potrebbe salvarti la v...
Batterie al litio in aereo, la FAA lanci...
HONOR Magic V5: un tablet a portata di s...
Se non rientrate nei requisiti, non aspe...
È ora di aggiornare Windows 11: c...
Messico: 'aumentare le tasse sui videogi...
Prezzi Amazon a picco: come aggiornare i...
NVIDIA Rubin CPX con 128 GB GDDR7: 30 Pe...
smart #5 Brabus, primo contatto con la s...
Tineco presenta il futuro della pulizia ...
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: 11:42.


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