Ich bevorzuge Ausnahmen gegenüber Asserts, denn wenn es so sein soll und nicht ist, möchte ich es wissen, damit ich es beheben kann, und die Abdeckung, die wir im Debug-Modus erhalten, ist nicht annähernd die reale Nutzung oder Abdeckung, so dass nur mit Debug.Assert nicht genug tun.
Die Verwendung von Asserts bedeutet, dass Sie Ihren Code nicht aufblähen, aber es bedeutet, dass Sie nur sehen können, wann und warum diese Verträge gebrochen werden, wenn Sie sie in einem Debug-Build abfangen.
Die Verwendung von Ausnahmen bedeutet, dass Sie den Vertragsbruch sehen können, wann immer er auftritt, sei es beim Debuggen oder bei der Veröffentlichung, aber es bedeutet auch, dass Ihr Release-Build mehr Prüfungen und Code enthält.
Sie könnten einen Zwischenweg einschlagen und Trace verwenden, um Ihre Vor- und Nachbedingungen in einer Art Anwendungsprotokoll festzuhalten, das Sie zur Fehlersuche verwenden könnten. Sie bräuchten jedoch eine Möglichkeit, diese Protokolle auszuwerten, um zu erfahren, welche Probleme bei Ihren Benutzern auftreten. Es besteht auch die Möglichkeit, dies mit Ausnahmen zu kombinieren, so dass Sie Ausnahmen für die schwerwiegenderen Probleme erhalten.
Die Art und Weise, wie ich es aber sehe, ist, dass, wenn der Vertrag wert ist durchzusetzen, dann ist es wert, eine Ausnahme zu werfen, wenn es bricht. Ich denke, das ist eine Frage der Meinung und der Zielanwendung. Wenn Sie Ausnahmen auslösen, möchten Sie wahrscheinlich eine Form von Ereignisberichtssystem, das Absturzberichte liefert, wenn ausgelöste Ausnahmen unbehandelt bleiben.