3. Unntak for innpakning

Sjekkede unntak virket kult i teorien, men viste seg å være en enorm frustrasjon i praksis.

Anta at du har en superpopulær metode i prosjektet ditt. Det kalles fra hundrevis av steder i programmet ditt. Og du bestemmer deg for å legge til et nytt avmerket unntak til det. Og det kan godt være at dette sjekkede unntaket er veldig viktig og så spesielt at bare main()metoden vet hva den skal gjøre hvis den blir fanget.

Det betyr at du må legge til det merkede unntaket til throwsklausulen for hver metode som kaller din superpopulære metode . Samt i throwsklausulen av alle metodene som kaller disse metodene. Og av metodene som kaller disse metodene.

Som et resultat throwsfår klausulene til halvparten av metodene i prosjektet et nytt avkrysset unntak. Og selvfølgelig er prosjektet ditt dekket av tester, og nå kompileres ikke testene. Og nå må du redigere kast-klausulene i testene dine også.

Og da må all koden din (alle endringene i hundrevis av filer) gjennomgås av andre programmerere. Og på dette tidspunktet spør vi oss selv hvorfor vi gjorde så mange blodige endringer i prosjektet? Arbeidsdag(er?) og ødelagte tester - alt for å legge til ett sjekket unntak?

Og selvfølgelig er det fortsatt problemer knyttet til arv og metodeoverstyring. Problemene som kommer fra sjekkede unntak er mye større enn nytten. Poenget er at nå er det få som elsker dem og få bruker dem.

Imidlertid er det fortsatt mye kode (inkludert standard Java-bibliotekkode) som inneholder disse avmerkede unntakene. Hva skal gjøres med dem? Vi kan ikke ignorere dem, og vi vet ikke hvordan vi skal håndtere dem.

Java-programmerere foreslo å legge inn sjekkede unntak i RuntimeException. Med andre ord, fange opp alle de avmerkede unntakene og deretter opprette ukontrollerte unntak (for eksempel RuntimeException) og kaste dem i stedet. Å gjøre det ser omtrent slik ut:

try
{
   // Code where a checked exception might occur
}
catch(Exception exp)
{
   throw new RuntimeException(exp);
}

Det er ikke en veldig pen løsning, men det er ikke noe kriminelt her: unntaket var rett og slett stappet i en RuntimeException.

Om ønskelig kan du enkelt hente den derfra. Eksempel:

Kode Merk
try
{
   // Code where we wrap the checked exception
   // in a RuntimeException
}
catch(RuntimeException e)
{
   Throwable cause = e.getCause();
   if (cause instanceof Exception)
   {
      Exception exp = (Exception) cause;
      // Exception handling code goes here
   }
}







Få unntaket lagret inne i RuntimeExceptionobjektet. Variabelen causekan kanskje null

bestemme typen og konvertere den til en avkrysset unntakstype.