Ich brauche eine Bedingung wie:
%Vor%Das heißt, ich erstelle eine sehr vertrauliche Datei, deren Daten nicht von Dritten eingesehen werden können, aber wenn irgendein Fehler im Code auftrat, wird meine Datei gelöscht, weil ich nicht genau weiß, wo Fehler aufgetreten sind.
Also möchte ich diesen Fehler mit try und catch abfangen und diese Datei löschen wollen. Wie kann ich irgendeine Ausnahme in C ++ fangen?
Dadurch wird die Datei gelöscht, wenn ein Fehler vorliegt.
Wie:
%Vor%Ein Wort zur Sicherheit: Wenn Sie eine Datei auf der Festplatte mit vertraulichen Informationen erstellen, kann jeder den Computer herunterfahren, während der Prozess läuft und die Datei noch geöffnet ist, die Festplatte herausnehmen und den Inhalt lesen.
Wenn sich die Datei auf dem Server befindet, können Sie grundsätzlich dasselbe tun, indem Sie Ihren Prozess pausieren, bevor er die Datei löscht.
Selbst wenn Sie die Datei aus dem Dateisystem entfernt haben, kann sie wahrscheinlich immer noch gelesen werden, da das Löschen einer Datei ihren Inhalt nicht löscht.
Ich würde empfehlen, sich nicht mit vertraulichen Informationen zu befassen, bis Sie die erforderliche Expertise haben - nicht, indem Sie von SO lernen. Aber wenn Sie es tun müssen, denke ich, dass der Watchdog-Prozess, der hier vorgeschlagen wird + Verschlüsselung ist der Weg zu gehen.
ZUERST:
Sie wollen das nicht tun.
Ausnahmen sind nicht für die Behandlung von Bugs vorgesehen, sondern für Laufzeitfehlerbedingungen, die es Ihrer Funktion unmöglich machen, die Voraussetzungen anderer Funktionen, die sie aufrufen muss, zu erfüllen oder die Versprechen einzuhalten eigene Nachbedingungen zu erfüllen (vorausgesetzt, der Anrufer hat die Voraussetzungen erfüllt). Siehe zum Beispiel diesen Artikel von Herb Sutter .
Schreib niemals so etwas:
%Vor%Aber eher:
%Vor%ZURÜCK ZUR FRAGE:
Ihr Programm hat ein undefiniertes Verhalten und höchstwahrscheinlich wird es keine Ausnahme auslösen, wenn Sie Folgendes tun:
%Vor%Es hilft also nicht, alle Ausnahmen zu fangen. Dies ist ein Fehler, d. H. Ein Fehler Programmierung , und es ist fraglich, ob Sie Fehler so behandeln sollten, dass die Steuerelemente in eine fehlerhafte Routine übertragen werden. Außerdem, wenn Sie das Vorhandensein von Fehlern in Ihrem Programm zugeben, könnten Sie nicht einfach die Kontrolle auf einen Buggy-Handler übertragen? Das kann es noch schlimmer machen.
Bugs sollten durch verhindert behandelt werden, wobei Assertions verwendet werden, die vielleicht Methoden wie testgetriebene Entwicklung usw. übernehmen.
In Bezug auf eine Möglichkeit, alle Ausnahmen abzufangen, können Sie Folgendes tun:
%Vor% Aber die Verwendung von catch (...)
wird als Konstruktionsrichtlinie entmutigt, weil es leicht zu Schluckfehlerbedingungen führt, die dazu bestimmt sind, behandelt zu werden und sie zu vergessen. Schließlich wurden Ausnahmen genau erfunden, um zu verhindern, dass Programmierer Prüfcodes vergessen, und catch (...)
macht das so einfach.
Für einen catch-everything-Zweck wäre es besser, alle Ihre Ausnahmen von std::exception
ableiten zu lassen und dann:
Was Sie verwenden möchten, ist RAII . In diesem Fall erstellen Sie die Klasse, die im Konstruktor den Namen der Datei und im Destruktor die Datei löschen. Bevor Sie irgendetwas mit der Datei machen, instanziieren Sie das Objekt einer solchen Klasse mit einem geeigneten Namen und später, wenn die Funktion aus irgendeinem Grund (sauber oder durch Ausnahme) beendet wird, wird die Datei gelöscht.
Beispielcode:
%Vor%Ihr Code versucht, auf Daten zuzugreifen, die außerhalb der definierten Grenzen liegen. Dies ist in jedem Fall eine absolut gültige Aufgabe. Je nach Situation und Compiler stürzt Ihr Code möglicherweise nicht mit einer Zugriffsverletzung / segfault ab, höchstwahrscheinlich nicht. Es wird höchstwahrscheinlich keine Ausnahme auslösen - in C ++ werden Ausnahmen nur explizit durch Code, nicht implizit vom System ausgelöst, es stürzt einfach ab, wenn es im Gegensatz zu höheren Programmiersprachen wie Java und C # schief geht.
Die catch(...)
-Syntax wird jede mögliche Ausnahme erfassen, aber dies ist in dieser Situation nicht anwendbar.
Wie die anderen Antworten darauf hinweisen, können Sie dieses Problem mit nativem Standard-C ++ nicht korrekt lösen. Tatsächlich ist es normalerweise eine wirklich schlechte Sache, wenn man versucht, etwas zu tun, nachdem undefined behaviour
aufgetreten ist. Wenn Sie den Status Ihrer App nicht kennen, wie können Sie Code sicher und sicher ausführen? Scheitern einfach schnell.
Der richtige Weg, um Ihr Problem zu lösen, ist, einen anderen, separaten "Wachhund" -Prozess durchzuführen, der Ihre Säuberung durchführt. Es ist ziemlich einfach - einfach den Watchdog-Prozess ständig auf die Existenz der Datei überwachen lassen. Wenn es erscheint, sollte der Watchdog-Prozess es löschen. Dieser Löschvorgang wird solange durchgeführt, bis der letzte Verweis auf die Datei vorhanden ist und dann wird der Löschvorgang ausgeführt [bei * nix OS wird die Datei in einen temporären Bereich umbenannt, bei Win-Systemen wird nur gewartet, bis die Datei nicht referenziert wird]. Sobald das Hauptprogramm mit der Datei fertig ist - entweder durch normale Mittel oder Abstürze oder was auch immer, wird das Betriebssystem die Datei für Sie korrekt löschen.
Wenn Sie sicherstellen möchten, dass Ihre 'private' Datei immer entfernt wird, wie wäre es mit einem 'Wrapper' Programm.
Erstellen Sie eine neue Anwendung, die Ihre geschützte Anwendung ausführt, und warten Sie, bis sie beendet wird. Beenden Sie Ihre private Datei, und beenden Sie dann, wenn es beendet wird (jedoch Crash oder Clean-Exit).
Führen Sie den Wrapper statt Ihrer Anwendung aus.
%Vor% C ++ erlaubt Ihnen, direkt mit dem Speicher zu arbeiten und ist teilweise C
kompatibel. Die Syntax, die Sie verwenden möchten:
Ist eine Art von C
Syntax, nicht C ++ und
ist der rohe Zugriff auf den Speicher. Das ist unexpected behavior
. Das bedeutet, dass niemand Ihnen sagen wird, was passieren wird. Vielleicht bekommst du einfach einen falschen Charakter und vielleicht wird dein Programm von OS gekillt. Oder der Mond wird auf die Erde fallen. =)
Wenn Sie Features auf hohem Niveau wünschen - verwenden Sie reines C ++. Betrachten Sie die Standardbibliothek anstelle von "C" -Arrays. Sie können std::vector
mit at (size_type n)
Methode verwenden, um out_of_range
Ausnahme zu erhalten - genau wie Sie es brauchen.
Tags und Links c++