Hier ist ein Standardszenario:
if(string.IsNullOrEmpty(Configuration.AppSettings["foobar"]))
throw new SomeStandardException("Application not configured correctly, bozo.");
Das Problem ist, ich bin nicht ganz sicher, welche Ausnahme SomeStandardException
sein sollte.
Ich habe das 3.5 Framework durchgesehen und zwei wahrscheinliche Kandidaten gefunden: ConfigurationException
und ConfigurationErrorsException
.
System.Configuration.ConfigurationException
Die Ausnahme, die ausgelöst wird, wenn ein Konfigurationssystemfehler aufgetreten ist.
Bemerkungen
DieConfigurationException
Ausnahme wird ausgelöst, wenn die Anwendung versucht, Daten in die Konfigurationsdatei zu lesen oder zu schreiben, dies jedoch nicht erfolgreich ist. Einige mögliche Gründe hierfür können fehlerhaftes XML in der Konfigurationsdatei, Dateiberechtigungsprobleme und Konfigurationseigenschaften mit ungültigen Werten sein.Hinweis:
Das
ConfigurationException
Objekt wird aus Gründen der Abwärtskompatibilität beibehalten. DasConfigurationErrorsException
Objekt ersetzt es für das Konfigurationssystem.
Diese Ausnahme klingt eigentlich perfekt für das, was ich brauche, aber sie wurde als veraltet markiert, also ixnay on atthay.
Dies bringt uns zu dem durchaus rätselhaften ConfigurationErrorsException
:
System.Configuration.ConfigurationErrorsException
Der aktuelle Wert ist keiner der EnableSessionState-Werte.
Wie Sie sehen können, ist die Dokumentation völlig nutzlos. (Dies ist sowohl in der lokalen als auch in der Online-Hilfe der Fall.) Eine Untersuchung der Klasse selbst zeigt, dass es für das, was ich will, ein drastischer Overkill ist.
Kurz gesagt, ich benötige eine Standardausnahme, die ausgelöst werden sollte, wenn eine Anwendungskonfigurationseinstellung fehlt oder einen ungültigen Wert enthält. Sie würden denken, dass das Framework eine solche Ausnahme für Anwendungen enthält. (Anscheinend, aber es wurde als veraltet markiert und durch etwas viel Größeres ersetzt.)
Welche Lösungen, wenn überhaupt, benutzt ihr dafür, und muss ich es aufsaugen und meine eigene Ausnahme dafür rollen?
Nachträge bearbeiten
Einige haben gefragt, ob ich einen Standardwert angeben könnte oder nicht, und fahren fort. In bestimmten Fällen ja, und in diesen Fällen wird die Ausnahme nicht ausgelöst. Für bestimmte Einstellungen gilt dies jedoch nicht. Zum Beispiel: Datenbankservernamen und -anmeldeinformationen, Authentifizierungsserver und Pfade zu installierten Anwendungen von Drittanbietern.
Es ist auch erwähnenswert, dass die Anwendung, an der ich hauptsächlich arbeite, eine Konsolenanwendung ist, die im Batch-Modus ausgeführt wird, und ich möchte, dass sie eine Ausnahme auslöst, die von der Hauptmethode abgefangen und entsprechend protokolliert wird, wenn das Objekt nicht ordnungsgemäß konfiguriert ist. (Es ist Legacy-Code, den ich geerbt habe und der derzeit nur davon ausgeht, dass alles pfirsichfarben ist.)
quelle
System.Configuration.ConfigurationErrorsException
wurde aktualisiert.Antworten:
Sie sind beim Auslösen von Ausnahmen nicht auf vorhandene Ausnahmen im Framework beschränkt. Wenn Sie sich dafür entscheiden, vorhandene Ausnahmen zu verwenden, müssen Sie die Dokumentation nicht unbedingt genau befolgen. Die Dokumentation wird beschrieben , wie der Rahmen eine gegebene Ausnahme verwendet, aber bedeutet keine Einschränkung, wie Sie zur Verwendung / Wiederverwendung einer bestehenden Ausnahme wählen.
Es ist Ihre Anwendung. Solange Sie sie dokumentieren und die Ausnahme, die im speziellen Fall eines fehlenden Konfigurationswerts ausgelöst wird, klar angeben, können Sie eine beliebige Ausnahme verwenden. Wenn Sie einen ganz bestimmten Hinweis auf einen fehlenden Wert wünschen , können Sie eine eigene ConfigurationSettingMissing-Ausnahme schreiben:
BEARBEITEN: Das Schreiben einer eigenen Ausnahme in diesem Fall bietet den zusätzlichen Vorteil, dass garantiert wird, dass keine Verwirrung darüber besteht, woher die Ausnahme stammt - aus dem Framework oder Ihrer Anwendung. Das Framework wird niemals Ihre benutzerdefinierten Ausnahmen auslösen.
UPDATE: Ich stimme den Kommentaren zu, daher habe ich die Unterklasse von Exception in ConfigurationErrorsException geändert. Ich denke, es ist im Allgemeinen eine gute Idee, benutzerdefinierte Ausnahmen von vorhandenen Framework-Ausnahmen nach Möglichkeit zu unterordnen und die Exception-Klasse zu vermeiden, es sei denn, Sie benötigen eine anwendungsspezifische Ausnahme.
quelle
Persönlich würde ich InvalidOperationException verwenden , da dies ein Problem mit dem Objektstatus ist - nicht mit dem Konfigurationssystem. Sollten Sie nicht zulassen, dass diese Einstellungen durch Code und nicht auch durch Konfiguration festgelegt werden? Der wichtige Teil hier ist nicht, dass es in app.config keine Zeile gab, sondern dass eine erforderliche Information nicht vorhanden war.
Für mich ist ConfigurationException (und deren Ersatz ConfigurationErrorsException - trotz der irreführenden MSDN-Dokumente) für Fehler beim Speichern, Lesen usw. der Konfiguration gedacht.
quelle
Wie Daniel Richardson sagte, ConfigurationErrorsException die zu verwendende. Im Allgemeinen wird nur empfohlen, eigene benutzerdefinierte Ausnahmetypen zu erstellen, wenn Sie über ein Szenario verfügen, um diese zu behandeln. Bei Konfigurationsfehlern, die normalerweise schwerwiegend sind, ist dies selten der Fall. Daher ist es normalerweise besser, den vorhandenen ConfigurationErrorsException-Typ wiederzuverwenden.
Vor .NET 2.0 wurde empfohlen, System.Configuration.ConfigurationException zu verwenden . ConfigurationException wurde in .NET 2.0 aus Gründen, die mir nie klar waren, veraltet, und die Empfehlung wurde geändert, um ConfigurationErrorsException zu verwenden.
Ich verwende eine Hilfsmethode, um die Ausnahme auszulösen, damit es einfach ist, die Ausnahme, die an einer Stelle ausgelöst wird, zu ändern, wenn von .NET 1.x auf 2.0 migriert wird oder wenn Microsoft beschließt, die Empfehlung erneut zu ändern:
quelle
Was ist mit
System.Configuration.SettingsPropertyNotFoundException
?quelle
ConfigurationErrorsException
ist die richtige Ausnahme für die von Ihnen beschriebene Situation. Eine frühere Version der MSDN-Dokumentation fürConfigurationErrorsException
ist sinnvoller.http://msdn.microsoft.com/en-us/library/system.configuration.configurationerrorsexception(VS.80).aspx
Die frühere MSDN-Zusammenfassung und Anmerkungen sind:
ConfigurationErrorsException
Ausnahme wird ausgelöst, wenn beim Lesen oder Schreiben von Konfigurationsinformationen ein Fehler auftritt.quelle
Die ConfigurationElement-Klasse (die Basisklasse vieler konfigurationsbezogener Klassen wie ConfigurationSection) verfügt über eine Methode namens OnRequiredPropertyNotFound (es gibt auch andere Hilfsmethoden). Sie können diese vielleicht anrufen.
Die OnRequiredPropertyNotFound wird folgendermaßen implementiert:
quelle
Ich würde es aufsaugen und mein eigenes rollen ... aber bevor Sie das tun, ist es möglich, dass das System einen Standardwert für diese Konfigurationseinstellung annimmt? Ich versuche im Allgemeinen, dies für jede Einstellung zu tun, die möglicherweise von Ops Management-Leuten übersehen wird ... (oder vielleicht sollte ich für so viele Einstellungen wie möglich sagen - für einige ist es eindeutig nicht angemessen, dass das System eine Standardentscheidung trifft. ..)
Im Allgemeinen ist eine benutzerdefinierte Ausnahme kein großer Aufwand ... hier ein Beispiel ...
quelle
Eine alternative Methode, die Sie für Ihre Konfigurationsdateien verwenden könnten, wäre die Verwendung von benutzerdefinierten Konfigurationsabschnitten im Gegensatz zu
AppSettings
. Auf diese Weise können Sie festlegen, dass eine EigenschaftIsRequired
und das Konfigurationssystem diese Prüfung für Sie übernehmen. Wenn die Eigenschaft fehlt, wird einConfigurationErrorsException
ausgelöst, was vermutlich die Antwort unterstützt, dass Sie diese Ausnahme in Ihrem Fall verwenden sollten.quelle
Meine allgemeine Regel wäre:
Wenn der Fall der fehlenden Konfiguration nicht sehr häufig ist und ich glaube, dass ich diesen Fall niemals anders als andere Ausnahmen behandeln möchte, verwende ich einfach die grundlegende Klasse "Exception" mit einer entsprechenden Meldung:
neue Ausnahme auslösen ("meine Nachricht hier")
Wenn ich möchte oder denke, dass es eine hohe Wahrscheinlichkeit gibt, dass ich diesen Fall anders als die meisten anderen Ausnahmen behandeln möchte, würde ich meinen eigenen Typ rollen, wie die Leute hier bereits vorgeschlagen haben.
quelle
Ich stimme der Prämisse Ihrer Frage eher nicht zu:
Laut der MSDN-Dokumentation zu System.Exception ( Ausnahmeklasse sollten Sie aus Leistungsgründen (auf die andere bei Stack Overflow und anderswo hingewiesen haben) keine Ausnahmen für Benutzereingabefehler auslösen . Dies scheint sinnvoll zu sein Nun - warum kann Ihre Funktion nicht false zurückgeben, wenn die Benutzereingabe falsch eingegeben wurde und die Anwendung dann ordnungsgemäß beendet wird? Dies scheint eher ein Designproblem als ein Problem zu sein, mit dem eine Ausnahme ausgelöst werden soll.
Wie andere bereits betont haben , gibt es keinen Grund, warum Sie Ihren Ausnahmetyp nicht durch Erben von System.Exception definieren können , wenn Sie wirklich eine Ausnahme auslösen müssen - aus welchem Grund auch immer.
quelle
Sie können versuchen, die XML-Ausnahme zu erben oder sie einfach zu verwenden.
quelle