ProgrammatieVB.NET ontwikkelaar, Backend ontwikkelaar

Hoe wordt exception handling en rethrowing geïmplementeerd in Visual Basic? Wat zijn de nuances tussen de operator Throw en Throw ex, en wat zijn de gevaren van een onjuiste herwerping van een uitzondering?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

In Visual Basic wordt exception handling uitgevoerd met het Try...Catch...Finally blok. Om een uitzondering opnieuw te werpen na het opvangen − dat wil zeggen, deze door te geven aan de oproepstack − worden de operator Throw of Throw ex gebruikt.

Verschillen:

  • Throw (zonder parameters) werpt de huidige uitzondering opnieuw en behoudt de oorspronkelijke oproepstack (Call Stack).
  • Throw ex werpt het uitzonderingobject, maar reset de oproepstack − de informatie over de werkelijke oorsprong van het probleem gaat verloren.
    Het wordt aanbevolen om Throw zonder parameters te gebruiken voor een correcte doorvoering van de uitzondering, als deze niet is gewijzigd.

Voorbeeld van correcte doorvoering:

Try DangerousOperation() Catch ex As Exception ' Logging... Throw ' de oproepstack blijft behouden End Try

Onjuiste wijze:

Try DangerousOperation() Catch ex As Exception Throw ex ' Oproepstack gereset, diagnostiek bemoeilijkt End Try

Vraag met een valkuil

Wat gebeurt er met de oproepstack als je Throw ex gebruikt in plaats van Throw?

Bij gebruik van Throw zonder parameters blijft de oorspronkelijke oproepstack behouden − de plek waar de uitzondering is opgetreden. Als je Throw ex gebruikt, begint de stack vanaf de huidige regel, en gaat de oorspronkelijke locatie van de uitzondering verloren. Dit bemoeilijkt het debuggen, omdat je niet zult zien in welk deel van de code het probleem zich heeft voorgedaan.

Voorbeelden van echte fouten door onwetendheid over de nuances van het onderwerp


Verhaal

In een groot bankproject gebruikten ontwikkelaars Throw ex om logicafouten te werpen. Bij het doorlopen van de logs bleek het onmogelijk het ontstaan van de uitzonderingen te bepalen omdat de correcte tracing ontbrak.


Verhaal

In de datalaag gebruikten ze Throw voor het doorgeven van SqlException, maar in sommige gevallen verving de autoformatteertool dit automatisch door Throw ex. Dit sloeg het systeem voor het automatisch extraheren van gegevens uit logs stuk en verhoogde de responstijd op incidenten.


Verhaal

Een poging om object Exception te wijzigen en dit door te geven via Throw zonder parameters leidde ertoe dat de wijzigingen niet in de logs werden weergegeven − alleen de expliciete creatie van een nieuw uitzonderingobject met behoud van de oorspronkelijke als InnerException hielp.