Fehlerbehandlung bei Systemen mit asynchronen Benachrichtigungen



  • Es gibt ja viele Systeme die asynchrone "completion" Benachrichtigungen verwenden.
    z.B. die ganzen async_ Methoden in Boost.Asio, alles was PostMessage (Win32) o.Ä. verwendet um zu signalisieren dass etwas fertig ist, oder auch selbstgebastelte Systeme ähnlicher Art.

    Also Systeme wo man irgendwie eine asynchrone Operation anwirft, und dann später über einen Callback bzw. das Ausführen eines "Handlers" über die Beendigung informiert wird.

    Dabei ergibt sich dann so-gut-wie immer das Problem: was soll die Library/das Framework machen wenn beim "posten" (=Eintragen in den Scheduler/die Message-Queue) ein Fehler (z.B. bad_alloc ) aufgetreten ist?

    Für die Applikation ist es total doof wenn es passiert, denn dann kommt der Callback einfach nie. Die Applikation bekommt als nix davon mit dass die Operation bereits abgeschlossen wurde, was im schlimmsten Fall dazu führt dass sie "hängt".

    Und für die Library ist es doof, denn die kann den Fehler kaum sinnvoll behandeln. Der Dispatcher/die Message-Queue wird ja verwendet damit man der Applikation garantieren kann dass der Callback/Handler in einem ganz bestimmten Thread ausgeführt wird (oder in einem Thread der etwas bestimmtes macht, wie z.B. die Poll Funktion des Dispatchers/der Message-Queue aufzurufen). Einfach einen synchronen Call absetzen ist also auch keine gute Idee.

    Boost.Asio "löst" das z.B. über die asio_handler_allocate Funktion. Die korrekte Verwendung von asio_handler_allocate ist aber alles andere als einfach, da sie u.A. total der "üblichen" Value-Semantik von Funktoren (Handler) widerspricht und man AFAIK von der Library auch keine Information darüber bekommen kann wie gross der über asio_handler_allocate angeforderte Speicher werden kann.

    Frage: wie geht ihr mit sowas um?



  • wie waere es eine error handling funktion/callback einzubaeuen. dann kann die applikation selbst mit dem fehler umgehen. ansonsten bleibt dir nicht mehr als die applikation zu beenden, verschlucken sollte die lib die fehler nicht, da selbst wenn die app nicht haengt/abstuerzt, eventuell folgefehler entstehen die viele daten korrumpieren ohne dass der user es weiss. und auch beim entwickeln wuerde man nicht merken dass ein fehler stattfand.


Anmelden zum Antworten