Avatar billede thomaz Nybegynder
23. maj 2001 - 11:03 Der er 8 kommentarer og
3 løsninger

try catch optimering

Har følgende kode: Jeg skal lave en hel masse try og catch, idet jeg kører RMI og hver gang jeg lave et remote kald skal jeg have en try catch, idet der kan opstå en exception ved mit Remote kald. Så hvis jeg i f.eks. en klasse skal kalde remote 5 gange skal jeg skrive try{} catch{}5 gange. Er det ikke en måde hvorpå man kan ligger det hele i en metoder eller klasse, så jeg kun skal kalde denne metode/klasse, hver gang jeg vil forspørge remote. Det virker lidt grinmt at at en hel masse try catch lige efter hinnanden

// database = objektet jeg arbejer remote på
// hentdata() = er metoden på objektet

try
{
String data = database.hentdata(string navn);
}
catch
{
RemoteException(re)
}
Avatar billede disky Nybegynder
23. maj 2001 - 11:05 #1
lav dine metoder med en \'throws RemoteException\'

og lad den metode der kalder styre dine try & catch

Det er klart nemmere. Og vel også mere korrekt i dit tilfælde
Avatar billede thomaz Nybegynder
23. maj 2001 - 11:29 #2
Vis jeg forståår dig ret så mener du følgende ?:

minMetode()throws RemoteException
{

  try
  {
    String data = database.hentdata(string navn);
  }

}

Ok der ved undgår jeg at skrive catch hver gang.
Men jeg skal stadigvæk lave en try hver eneste gang jeg vil have adgang rit mit RemoteObjekt.
Vil nu gerne hver gang jeg skal have adgang tim mit Remote objekt kalde 1 metode der udfører alle mine try catch. Er det mon muligt
Avatar billede logical Nybegynder
23. maj 2001 - 11:31 #3
I har begge to fat i noget rigtigt. Men der er vel egentlig ikke noget endegyldigt svar.

Hvis du er bekymret over at have
try {
  statement;
} catch (RemoteException re) {}
try {
  nextStatement;
} catch (RemoteException re) {}

Så er det muligt at lægge begge statements ind i en samlet try-catch, måske for en hel metode.
try {
  statement;
  nextStatement;
} catch (RemoteException re) {}

Du kan også tage de logiske ting, der skal udføres over for dit remote objekt og pakke ind i en samlet metode, som så generelt kaster en RemoteException videre til en styrende klasse.

Du skal under alle omstændigheder gøre dig bevidst, hvordan du vil håndtere situationen, for hvad nu hvis det ikke kan lade sig gøre pga netværksproblemer etc.

Om du så kører en statement af gangen, eller fyrer et helt scenario, skal du spekulere i din nødplan.

try {
  doSomething();
} catch (RemoteException re {
  // how do we fallback in case of emergency
}

Hvis du har flere statements i et scenario, vil du ikke kunne pinpointe præcis, hvor problemet opstår, men sikre dig en alt eller intet løsning. Dvs. hvis du arbejder på nogle attributter inde i en klasse, og du udfører et remotekald, ændrer dine attributter, og laver et remotekald mere, skal du være bevidst om, at dine attributter muligvis er ændret, muligvis ikke, når der kommer en exception. Det imødegås typisk ved at gemme internt i lokale variable i metoden, indtil du har udført dit sidste remotekald, og derefter flytte data ind i attributterne.

Så.. Du kan se, du slipper nok ikke for at skulle håndtere det, men du har alligevel lidt råderum.
Avatar billede delbing Nybegynder
23. maj 2001 - 11:41 #4
Der er flere forskellige måder at håndtere det på.

For det første kan du pakke det ind i en metode eller klasse.

Metodeversionen kunne se sådan ud:

private String hentMineData(String navn, SomeObject database) {
String data = null;
try
{
data = database.hentdata(string navn);
}
// din catch ser lidt underlig ud??
catch
{
RemoteException(re)
}
return data;
}

Hvis database og navn ikke er en lokale variable kan du spare argumenterne til metoden.
Ønsker du at håndtere Exceptions forskelligt i forskellige kald til metoden, kan du lave nogle objekter der ved hvordan det skal gøres, og så enten give dem med som argument eller lade en variabel referere til den aktuelle handler.


Avatar billede disky Nybegynder
23. maj 2001 - 12:28 #5
thomaz: det er nemlig helt korrekt du gør det på den måde.

Den metode som så kalde \'minMetode\'

f.eks:

....
minMetode()
....

skal så have en try/catch rundt om.

Så det bliver til:

try
{
  minMetode();
}
catch (RemoteException e)
{

}


Men hvis du inde i minMetode gerne vil have din try/catch, men laver noget mange gange som skal catches, så går følgende.

{
  String data;
  try
  {
    data = database.hentdata(string navn);
    LavNogetAndet
    data = database.hentdata(string navn);
    LavNogetAndet
    data = database.hentdata(string navn);
    LavNogetAndet
    data = database.hentdata(string navn);
    LavNogetAndet
    data = database.hentdata(string navn);
    LavNogetAndet
  }
  catch (RemoteException e)
  {
  }
}

Du kan sagtens fange 10 ting med en try/catch.
Avatar billede delbing Nybegynder
23. maj 2001 - 12:34 #6
Det var da en utroligt dårlig ide. Så hvis en af kaldende smider en Exception så:
1) De efterfølgende kald udføres ikke, da vi er færdige med try blocken
2) Vi ved ikke hvilket kald der resulterede i en Exception.
3) Farvel OO.
Avatar billede disky Nybegynder
23. maj 2001 - 12:36 #7
delbing: det må du jo diskuterer med SUN, for de gør det selv i deres kode.

1. har du hørt om finally ???

2. det er korrekt

3. wrong
Avatar billede logical Nybegynder
23. maj 2001 - 12:37 #8
delbing:
Ah, afhængig lidt af, hvad der sker, kan minMetode sagtens isoleres som en transaktion, hvor kun atomiteten er interessant, og det betyder ikke nødvendigvis farvel OO.

1 og 2 er vi enige om, men kun den aktuelle use case kan afgøre om det har interesse.
Avatar billede delbing Nybegynder
23. maj 2001 - 12:48 #9
Den konstruktion du nævner kan (og bør) selvfølgelig bruges til at _forhindre_ at resten af try blocken udføres hvis der kommer en Exception.

1. Jeg kan ikke se hvad finally kan bruges til her? Hvordan vil du få finally blocken til at udføre de kald du mangler?

3. Det er ren hacking at proppe en masse ting ind i samme try block fordi man ikke gider skriver try-catch blokke. En meget bedre model er at have et objekt (eller måske blot en metode) som henter dataen _og_ håndterer evt. Exceptions. En god OO model vil håndtere Exceptions tæt på der hvor de opstår, ikke bare delegere dem videre til andre objekter som ikke har noget med det at gøre. Jeg gider ikke i gang med en flame omkring OO design, men der hvor man laver \'data = database.hentdata()\' er man (i en god model) interesseret i at få og behandle data, ikke at håndtere Exceptions som handler om noget andet (som fx en RemoteException).
Avatar billede disky Nybegynder
23. maj 2001 - 14:12 #10
delbing: det er jo også derfor jeg siger man kan have mange exceptions gemt i en.

Og det er stadigvæk OO
Avatar billede thomaz Nybegynder
23. maj 2001 - 15:07 #11
Takker for alle svarerne, også selv om jeg næsten startede en \"religions\" krig :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester