Verwijderd schreef op 29 oktober 2004 @ 15:11:
Hoe had je het dan gedacht? Kun jij me uitleggen hoe je een fout kunt afvangen die je niet verwacht? Omdat de fout eigenlijk niet kan voorkomen, behalve door een programmeer fout???
Het probleem bij het stukje code dat je geschetst hebt, is dat je verder gaat met state die mogelijk incorrect is. Het opvangen van fouten heeft alleen zin als je daarmee een inconsistente state kan repareren. Zo niet, dan zou je wel kunnen loggen, maar daarna moet je doorthrowen.
In jouw voorbeeld is in principe de myobject het probleem, hoewel voor dit probleem de inconsistente state alleen de realyimportValue is. Jouw catch hander zou dus iets met die realyimportValue moeten doen om de state voor deze methode te repairen. Of de handler had om de hele code heen moeten staan om maar iets te noemen.
Maar zoals je merkt is dit specifiek voor dit probleem. Je kan dit in het algemene geval
niet doen, tenzij je bepaalde garanties hebt wat de affected state is.
Transacties op een database kunnen jouw bijvoorbeeld dit soort isolatie garanties geven. Om het simpel te zeggen: als er iets fout gaat binnen je programma, dan is het geheugen corrupt en de transactie op de database. Je kan dan de fout opvangen door het geheugen overnieuw te initialiseren en de transactie te herstarten.
Het probleem wordt een stuk lastiger wanneer je meerdere applicaties/threads hebt die samen ook wat data delen. Als je weer naar je algemene handler kijkt, dan zou ook de gedeelde data corrupt geraakt kunnen zijn (tenzij je daar weer isolement garanties op hebt). De state repareren is lastig, vermoedelijk moeten de overige threads ook wat zaken repareren. Dit is applicatie specifiek en in sommige gevallen theoretisch onmogelijk.
Kan dit op een algemene manier? Daarvoor heb je weer wat extra aannamen op je omgeving nodig. Bijvoorbeeld alle threads killen en overnieuw een initiele state opbouwen en threads weer starten. Dit komt eigenlijk overeen met een herstart van de totale applicatie. Maar hiervoor heb je dus ook bepaalde consistentie/durability aannamen nodig. Wat een minimale set van aannamen is om dit te bereiken kan ik zo niet zeggen. Want je zult nu bijvoorbeeld moeten garanderen dat er geen gegevens "verloren" zijn gegaan (durability). En wie zegt dat het probleem niet blijft optreden na een herstart?
Om nog maar te zwijgen van dat in een multi-threaded systeem met gesharede state je ook nog met race condities te maken hebt die ervoor kunnen zorgen dat op het moment dat je de fout kan opvallen, het zaakje al niet meer te redden is...
Het zal in de praktijk eenvoudiger zijn de applicatie zo te maken dat je op een willekeurig moment de stekker eruit kan trekken zonder consistentie van de totale applicatie te verliezen. Dan kan je in geval van problemen een herstart doen (onder aanname dat daarmee de "corruptie" ongedaan wordt gemaakt bijv. door een impliciete rollback door de database). Maar dat wil nog niet zeggen dat het nooit mogelijk is om een onverwacht probleem op te vangen. Maar dan zul meer van het systeem moeten vereisen (meer aannamen).
[
Voor 18% gewijzigd door
Infinitive op 29-10-2004 16:14
]