Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce
Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce
REDMI Note 17 Pro porta in fascia media una batteria da 8.340 mAh con ricarica HyperCharge a 67W, un display AMOLED da 6,83 pollici capace di picchi di luminosità molto elevati e una struttura certificata TÜV SÜD contro cadute e infiltrazioni d'acqua, il tutto racchiuso in una scocca da 223 grammi. Lo abbiamo provato per diversi giorni tra fotocamera, prestazioni, autonomia e prezzo sul mercato italiano
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.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 11-04-2007, 06:50   #1
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
[Java] contrarre catch

questa è una banalità sintattica: mettiamo che devo chiamare un metodo con una clausola throws che non finisce mai (cioè un metodo che lancia molte eccezioni), e mettiamo che le voglio catturare tutte subito con un try attorno alla chiamata; infine mettiamo anche che tutti quanti i catch di quel try hanno lo stesso identico codice, quale potrebbe essere ad es. un semplice "return false;". la domanda è: sintatticamente parlando è possibile contrarre tutti i catch in un solo catch che piglia tutte le eccezioni? lo scopo è ovviamente quello di non scrivere mille volte lo stesso codice di handling.

sono a conoscenza del fatto che è possibile sfruttare il polimorfismo catturando la classe a monte anziché quella specifica (cioè catturo semplicemente Exception) ma ovviamente è una soluzione brutta perché filtra anche eccezioni che non voglio filtrare.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 11-04-2007, 08:21   #2
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da 71104 Guarda i messaggi
sono a conoscenza del fatto che è possibile sfruttare il polimorfismo catturando la classe a monte anziché quella specifica (cioè catturo semplicemente Exception) ma ovviamente è una soluzione brutta perché filtra anche eccezioni che non voglio filtrare.
Non è detto. Immaginiamo che ci sia un metodo() che ha come throws: IOException, InterruptedException, SQLException, ClassNotFoundException (è solo un esempio ). Supponiamo che IOException non voglio gestirla ma magari farla gestire "più sopra".

Soluzione 1:
Codice:
try
{
    metodo ();
}
catch (IOException ioe)
{
    throw ioe;
}
catch (Exception e)
{
    // gestisci il resto
}
Soluzione 2:
Codice:
try
{
    metodo ();
}
catch (Exception e)
{
    if (e instanceof IOException)
        throw e;

    // gestisci il resto
}
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 11-04-2007, 12:08   #3
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
d'accordo, ma la soluzione è brutta comunque perché il "// gestisci il resto" gestisce anche tutte le eccezioni unchecked (che derivano sempre da Exception, come le altre). se per esempio il codice di metodo() è buggato e in alcuni casi spara una NullPointerException, io voglio che la NullPointerException arrivi a monte. ciò che io speravo è che a livello sintattico esistesse una sorta di:
Codice:
try
{
	metodo();
}
catch (Exception1 e1, Exception2 e2, ecc. ecc.)
{
	// gestione unica per tutte quelle che voglio catturare
}
piuttosto che:
Codice:
try
{
	metodo();
}
catch (Exception1 e1)
{
	// gestione Exception1, identica a tutte le altre
}
catch (Exception2 e2)
{
	// gestione Exception2, identica a tutte le altre
}
.
.
.
insomma volevo solo evitare di scrivere N volte lo stesso codice di handling
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 11-04-2007, 12:37   #4
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da 71104 Guarda i messaggi
d'accordo, ma la soluzione è brutta comunque perché il "// gestisci il resto" gestisce anche tutte le eccezioni unchecked (che derivano sempre da Exception, come le altre). se per esempio il codice di metodo() è buggato e in alcuni casi spara una NullPointerException, io voglio che la NullPointerException arrivi a monte.
Per quanto riguarda la sintassi non c'è alcuna scappatoia, il parametro formale del catch può essere uno solo.

Se a te interessa che le eccezioni unchecked vengano gestite a monte, allora ripropongo la mia soluzione 2, ti basta testare:
Codice:
if (e instanceof RuntimeException)
    throw e;
Credo che sia la soluzione migliore, visto che vuoi avere un unico codice per il catch. Di più non saprei dirti, anche perché non credo che ci siano altre possibilità.
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 11-04-2007, 13:24   #5
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
ullallà, non conoscevo la classe RuntimeException: non sapevo che tutte le eccezioni unchecked venissero da lì. questo thread mi è stato utile
per quanto riguarda la domanda iniziale, penso che la soluzione migliore per non scrivere N volte lo stesso codice di handling sia quella di racchiunderlo tutto in un metodo di handling chiamato N volte dagli N catch.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 13-04-2007, 11:34   #6
pranzu
Junior Member
 
Iscritto dal: Apr 2002
Città: Casteddu
Messaggi: 15
Soluzione 3

Ciao. La lettura del thread mi ha interessato e portato alla seguente soluzione, meno semplice ma più generale delle soluzioni precedenti:

Codice:
import java.io.IOException;

interface MyThrowables {}

class MyUncheckedException 
	extends ClassNotFoundException 
	implements MyThrowables {
}

class MyCheckedException
	extends IOException 
	implements MyThrowables {
}

class MyError
	extends NoClassDefFoundError 
	implements MyThrowables {
}

public class TestMyThrowables {

	public static void throwsMyThrowables() throws Throwable {
		throw new Error();
	}

	public static void main(String[] args) throws Throwable {
		try {
			throwsMyThrowables();	
		} catch(Throwable t) {
			if(t instanceof MyThrowables) {
				System.out.println("Caught an MyThrowables");
			} else {
				System.out.println("Thrown not an MyThrowables");
				throw(t);
			}
		}	
	}
}
Il gruppo di eccezioni o errori (in generale Throwable) che vuoi gestire in modo unico sono accomunati dall' interfaccia MyThrowables.
Il prezzo è dover estendere ogni classe Throwable che ti interessa (ClassNotFoundException, IOException, NoClassDefError, ...).
pranzu è offline   Rispondi citando il messaggio o parte di esso
Old 13-04-2007, 11:43   #7
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Se c'è un metodo che dichiara il rilascio di 17 eccezioni diverse intercetti le 17 eccezioni una per una. Un instanceof all'interno di un catch è come dire "volevo usare C ma mi hanno costretto...".
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 13-04-2007, 11:46   #8
pranzu
Junior Member
 
Iscritto dal: Apr 2002
Città: Casteddu
Messaggi: 15
Errata corrige

Mi correggo da solo. Ho divagato.
Non risolve per niente il problema iniziale.
Sorry
pranzu è offline   Rispondi citando il messaggio o parte di esso
Old 13-04-2007, 12:32   #9
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
Se c'è un metodo che dichiara il rilascio di 17 eccezioni diverse intercetti le 17 eccezioni una per una. Un instanceof all'interno di un catch è come dire "volevo usare C ma mi hanno costretto...".
il problema è che il metodo che rilascia la svaria di eccezioni non lo posso modificare (è di Java ^^) e al mio programma non interessa gestire differentemente i casi uno per uno: lui ci prova, poi se qualcosa fallisce return false; e amen
tanto l'utente non è che si può pretendere che capisca in dettaglio il motivo del failure...
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 13-04-2007, 13:19   #10
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
So che è scomodissimo, noioso ed esteticamente terribile ma le eccezioni vanno prese e gestite singolarmente perchè dal punto di vista di chi le cattura esse valgono in quanto segnale di uno specifico sintomo. Generalizzando il "catch" vanifichi la specializzazione dell'allarme. E' qui la differenza tra un'eccezione e il famigerato valore restituito dalle funzioni C.

Naturalmente si fa un atto di fede: chi ha dichiarato il rilascio di quelli mille eccezioni sapeva ciò che stava dicendo. Ognuna di quelle eccezioni segnala un problema autonomo non comprensibile attraverso uno dei supertipi di quell'eccezione.

Ripeto, sintatticamente è terribile. Ti ammazzi di parentesi, per non parlare dei finally in cui invochi un metodo che rilascia un'altra eccezione. Ma la programmazione orientata agli oggetti, a mio sommessissimo avviso, è una questione non di forme ma di significati. E il pregio di Java non è quello di essere formalmente elegante o sintetico ma semanticamente (ok, vinco il premio per il peggior avverbio della settimane) espressivo.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 13-04-2007, 17:58   #11
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
ma capisco benissimo la questione e non avrei assolutamente voluto che quel metodo di quella classe di Java fosse stato fatto in maniera minimamente diversa o che avesse accomunato anche due sole delle eccezioni che lancia.

il mio specifico problema è che io specificamente non ho interesse a gestire tutti quei casi singolarmente perché mi basta che la gestione sia sempre la stessa per tutti. solo in questo caso però! poi, in futuro, quando magari farò un altro programma più decente allora mi passerà per la testa di restituire all'utonto un feedback diverso per ciascuno di quei casi, e quindi mi sarà utilissimo che ciascuno di quei casi sia rappresentato da un'eccezione diversa. va benissimo.

in conclusione, la questione che sollevavo in questo thread era banalissima: siccome il try/catch che ho fatto ha lo stesso identico codice in tutti i catch (un return false, ma poteva andare peggio), non è che tante volte c'era per caso modo di scriverlo una volta sola anziché N volte?

risposta: no, se non semplicemente mettendo quel codice in un metodo e chiamando il metodo N volte (soluzione ovviamente non attuabile nel caso di un semplice return false). alla mia modestissima opinione questa pare una lieve carenza sintattica di Java, tutto qui ^^

ora che abbiamo oltremodo chiarito le nostre reciproche posizioni, non cominciamo con le solite cose da anti-flame come "certo hai ragione tu, ma è anche così" - "no, hai più ragione tu e ti voglio bene, ma è anche colà"

Ultima modifica di 71104 : 13-04-2007 alle 18:01.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 13-04-2007, 23:03   #12
tglman
Senior Member
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 414
Mi Immetto Anche io nella discussione.

Allora io nn sono per nulla d'accordo agli instanceOf ma comunque ci sono metodi per gestire le eccezioni multiple anche in un solo catch o la massimo in due per esempio:
Codice:
try {
	metodo();
} catch(RuntimeException e) {
	throw e;
} catch(Exception e) {
	//gestione di tutte le eccezioni dichiarate!
}
in questo modo rimando tutte le RuntimeException e catturo le eccezioni dichiarate e le gestisco con un solo catch.
tglman è offline   Rispondi citando il messaggio o parte di esso
Old 14-04-2007, 09:15   #13
Mixmar
Senior Member
 
L'Avatar di Mixmar
 
Iscritto dal: Feb 2002
Città: Trento
Messaggi: 962
Quote:
Originariamente inviato da tglman Guarda i messaggi
Mi Immetto Anche io nella discussione.

Allora io nn sono per nulla d'accordo agli instanceOf ma comunque ci sono metodi per gestire le eccezioni multiple anche in un solo catch o la massimo in due per esempio:
Codice:
try {
	metodo();
} catch(RuntimeException e) {
	throw e;
} catch(Exception e) {
	//gestione di tutte le eccezioni dichiarate!
}
E' un po' la stessa idea di andbin...
__________________
"Et Eärallo Endorenna utúlien. Sinome maruvan ar Hildinyar tenn' Ambar-metta!" -- Aragorn Elessar, Heir of Isildur
Mixmar -- OpenSuSE 11.1 on AMD 64 3000+ on DFI LanParty nF4-D | GeForce 6600 GT + Thermaltake Schooner on Samsung 710N
Storage -- ( 2 x Hitachi Deskstar 80 Gb + 1 x Hitachi 250 Gb ) = 1 RAID 5 + 1 Storage space LaCie Ethernet Disk Mini 250 Gb | HP - DV2150 EL MILAN CLAN
Mixmar è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce Recensione REDMI Note 17 Pro: il midrange con ba...
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...
Microsoft Defender: falso allarme sull'a...
Aerei in volo e truppe pronte all'assalt...
Usano Claude per hackerare OpenAI: ricer...
RatHat: il nuovo malware Android usa il ...
Domanda di petrolio in calo di 2,5 milio...
Il meglio delle offerte weekend Amazon a...
Dopo oltre 100 anni di tentativi, l'IA d...
Speciale robot aspirapolvere in offerta ...
L'IA sta cancellando i lavori junior? Il...
Debutta Chery Italia: non più sol...
Addio ai dischi? Xbox ci aveva già...
Speciale TV Amazon: 4 modelli, da 139€ f...
Il nuovo iPhone 18 Pro Max ha una ricari...
Speciale smartphone Android: 7 modelli i...
La Camera USA presenta il conto: i data ...
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: 15:00.


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