Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Qrevo Curv 2 Flow è l'ultima novità di casa Roborock per la pulizia di casa: un robot completo, forte di un sistema di lavaggio dei pavimenti basato su rullo che si estende a seguire il profilo delle pareti abbinato ad un potente motore di aspirazione con doppia spazzola laterale
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Abbiamo guidato per diversi giorni la Alpine A290, la prima elettrica del nuovo corso della marca. Non è solo una Renault 5 sotto steroidi, ha una sua identità e vuole farsi guidare
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Abbiamo provato a fondo il nuovo Magic 8 Lite di HONOR, e per farlo siamo volati fino a Marrakech , dove abbiamo testato la resistenza di questo smartphone in ogni condizione possibile ed immaginabile. Il risultato? Uno smartphone praticamente indistruttibile e con un'autonomia davvero ottima. Ma c'è molto altro da sapere su Magic 8 Lite, ve lo raccontiamo in questa recensione completa.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 09-06-2010, 15: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, 16: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, 16: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, 22: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, 23: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 11-06-2010, 00: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, 11: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, 11: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, 13: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, 13: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, 17: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 17:07.
tylerdurden83 è offline   Rispondi citando il messaggio o parte di esso
Old 15-06-2010, 17: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 17:08.
tylerdurden83 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Roborock Qrevo Curv 2 Flow: ora lava con un rullo Roborock Qrevo Curv 2 Flow: ora lava con un rull...
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite Alpine A290 alla prova: un'auto bella che ti fa ...
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile Recensione HONOR Magic 8 Lite: lo smartphone ind...
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora Sony WF-1000X M6: le cuffie in-ear di riferiment...
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI Snowflake porta l'IA dove sono i dati, anche gra...
Arianespace potrebbe lanciare il primo r...
Google Pixel 10a disponibile al prezzo m...
Microsoft Copilot nei guai: email riserv...
AOC a 399€ su Amazon: QD-OLED 240 Hz e 0...
La Cina ha recuperato dal mare il primo ...
Boeing CST-100 Starliner: la NASA rende ...
hiop e TaDa uniscono le forze per trasfo...
Thermal Grizzly mostra il Ryzen 7 9850X3...
AMD Ryzen 'Olympic Ridge' Zen 6 per desk...
Donald Trump renderà pubbliche in...
Prezzo mai visto da mesi: ECOVACS DEEBOT...
Non solo S26, Samsung sta per lanciare a...
Windows 11 avrà a breve uno Speed...
Ask Intel: l'assistente IA che ti aiuta ...
Nasce Freedom.gov: il portale USA per ag...
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: 20:41.


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