Variabele cleanup bij throw exception

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Juup
  • Registratie: Februari 2000
  • Niet online
Wat is een nette manier om variabelen op te ruimen voor een throw?

Voorbeeld pseudo-code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
byte[] secret = getSecret();
if (cond1)
{
    try {
        workOn(secret);
    } catch (e) {
        memzero(secret);
        throw new AbcExcetion(...);
    }
}
else
{
    memzero(secret);
    throw new XyzExcetion(...);
}


Deze code stijl schaalt heel slecht met meerdere conditions, try/catches en secrets.
Wat zou een betere manier kunnen zijn?

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


Acties:
  • 0 Henk 'm!

  • Marco1994
  • Registratie: Juli 2012
  • Nu online
Daar kun je toch default finally voor gebruiken?

[ Voor 15% gewijzigd door Marco1994 op 11-10-2019 08:51 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Maak een class van secret en geef deze een destructor die memzero aanroept? Moet je opletten dat die altijd uit scope gaat en even opletten met garbage collection (voor zover van toepassing)

Acties:
  • +3 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 03-10 23:11

DataGhost

iPL dev

Al eens gekeken naar finally?

Acties:
  • +1 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
finally

Edit: Damn you @DataGhost :P

Overigens zou 't handig zijn als je aangeeft om welke taal het gaat... Sowieso is je topicstart vrij karig (zie onze Quickstart, maar daar hoef ik jou niet meer op te wijzen na bijna 3.5k posts, wel?)

[ Voor 137% gewijzigd door RobIII op 09-10-2019 15:37 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Juup
  • Registratie: Februari 2000
  • Niet online
Ah sorry ik dacht laat ik het algemeen houden voor een bredere discussie maar ok.
Ik ben het nu in ES6 (javascript) aan het schrijven.
M'n probleem gaat niet zozeer over 1 try/catch maar over de schaalbaarheid bij meerdere conditions, try/catches en secrets.

Ik zit er nu aan te denken om er 1 dikke try/catch/finally omheen te zetten die de Exceptions rethrowt.
Maar om nou te zeggen dat dat zo mooi is...

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 13:10

Creepy

Tactical Espionage Splatterer

Een rethrow met een finally? Dat is niet nodig he ;)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • +1 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Creepy schreef op woensdag 9 oktober 2019 @ 23:17:
Een rethrow met een finally? Dat is niet nodig he ;)
Wel als je in de finally cleanup wil doen maar de exception wil doorgooien naar de caller ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 13:10

Creepy

Tactical Espionage Splatterer

Daar heb je dan toch je catch voor om dat te regelen? Waarom zou je dat nog in een finally willen doen naast cleanup?

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:54
Creepy schreef op donderdag 10 oktober 2019 @ 10:47:
Daar heb je dan toch je catch voor om dat te regelen? Waarom zou je dat nog in een finally willen doen naast cleanup?
Dan hoef je het maar één keer te definieren en wordt het ook mooi opgekuist in 't geval er geen exception gegooid wordt.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Creepy schreef op donderdag 10 oktober 2019 @ 10:47:
Daar heb je dan toch je catch voor om dat te regelen?
Precies.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var file = new System.IO.StreamReader(@"c:\users\public\test.txt");
char[] buffer = new char[4096];
try
{
    file.ReadBlock(buffer, index, buffer.Length);
}
catch (System.IO.IOException e)
{
    throw; // Rethrow
}
finally // "Guaranteed" to run.
{
    if (file != null)
        file.Close();
}
Ik dénk dat je mijn reactie leest alsof je de (re)throw in de finally wil doen, wat ik dus niet zo bedoel ;)

De "guaranteed" staat met reden tussen quotes; for all intents and purposes wordt de finally inderdaad gegarandeerd, maar er zijn dus uitzonderingen (edge-cases weliswaar, maar toch).

[ Voor 31% gewijzigd door RobIII op 10-10-2019 11:08 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16:32

Janoz

Moderator Devschuur®

!litemod

Als je niks met de exception gaat doen, hoef je hem ook niet te catchen lijkt me. Nu weet ik niet hoe het in C# gaat, maar in java kun je gewoon:

Java:
1
2
3
4
5
try {
  workOn(secret);
} finally {
  memclear(secret)
}

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Juup
  • Registratie: Februari 2000
  • Niet online
Ja try/finally werkt ook in ES6.
Ik wist trouwens niet dat de finally na een return in de try wordt uitgevoerd.

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.

Pagina: 1