Spiele Programmierer hat geschrieben:Ich bin ehrlich gesagt etwas skeptisch. Wie zum Beispiel allokierst du Speicher so dass beim Fehlschlagen so ein Callback aufgerufen wird?
Ich verstehe gerade nicht ganz – wofür Speicher? Um Stack Overflows zu vermeiden?
Spiele Programmierer hat geschrieben:Warum übergibst du nicht zB. einen Pointer zu einer kleinen statischen konstanten Struktur die dann am besten auch gleich einen String mit der Fehlerbeschreibung enthält (+ ggf. weitere Informationen). Das hätte in meinen Augen viele Vorteile: Es ist Typsicher, es kann beliebig erweitert werden, man muss keine IDs mehr zuweiten, alle weiteren Informationen sind dann ganz lokal bei der Fehlerdefinition.
Wie identifiziere ich denn von Python aus, dass es sich bei diesem Zeiger um eine
FileAccessException handelt? Durch den String, der da drin ist? Dann habe ich statt
int-IDs nun
char *-IDs, das ist keine Verbesserung sondern nur viel Bloat. Oder ist der String nur zur Convenience da, wie
std::exception::what()? In dem Fall ist er nutzlos weil die UI ihn erst ins Chinesische übersetzen muss um ihn anzuzeigen, und darum alle Strings im Voraus bekannt sein müssen.
Meine Erfahrung in C++ ohne Exceptions sind sehr negativ. Und das, obwohl ich eigentlich alles andere als ein Freund der Exceptions bin, aber in C++ fehlen einach alternative Sprachmittel. Das geht damit schon los, dass RAII praktisch unbrauchbar wird, weil man im Konstruktor keine Fehlercodes zurückgeben kann. Falls im Konstruktor mehrere Objekte konstruiert werden die jeweils Fehler auslösen können, wird das Konzept der Initialisierungsliste zum Problem.
Überhaupt ist es ausgesprochen mühselig, auf alle Rückgabewerte zu reagieren:
Weißt du, was das Schöne am zweiten Quelltext ist? Dass ihn jeder sofort versteht. Ich kann den Praktikanten mit C#-Erfahrung draufgucken lassen und der weiß sofort, ob Fehler behandelt werden oder nicht. Im ersten Beispiel muss ich ihn erstmal eine Woche in C++-Idiome einarbeiten, dann die Eigenheiten der verschiedenen Smart Pointers erklären, und dann C++-Wrapper für zwei C-Fremdbibliotheken schreiben, weil sie Parameter für
a und
b sind.
Danke für den Link! Wäre Rust ein, zwei Jahre früher gekommen … ach wer weiß :(
Nun, dafür müsstest du die Methode in mehrere Schritte unterteilen und dann im User Code über alle Thumbnails iterieren, so dass du jeden einzelnen Aufruf abfangen kannst und mit dem nächsten Thumbnail fortfahren.
Evt. könnten dabei Coroutines in C++17 weiterhelfen, allerdings weiß ich darüber zu wenig.
Jetzt hat mein C++-zu-C#-Interface statt einer Funktion und einem Callback
- 30 verstreute Funktionen
- eine Iteratorklasse
- einen Wrapper auf C++-Seite, der alle C++-Exceptions fängt und in was .NET-kompatibles übersetzt, weil man Exceptions nicht in andere Sprachen schmeißen darf und wenn doch, dann schlecht auswerten kann
- die Coroutines crashen erstmal die Common Language Runtime weil da irgendwas nicht Fiber-Safe war
Und jeder, der da jemals einen Bug beheben soll, muss sich erstmal in
alles einarbeiten. Nein. Einfach
nein.