Wenn Sie diese viel tun und wünschen Ihnen eine nicht-Ausnahme Wurf Äquivalent hatte, versuchen:
public static class Catching<TException> where TException : Exception
{
public static bool Try<T>(Func<T> func, out T result)
{
try
{
result = func();
return true;
}
catch (TException x)
{
// log exception message (with call stacks
// and all InnerExceptions)
}
result = default(T);
return false;
}
public static T Try<T>(Func<T> func, T defaultValue)
{
T result;
if (Try(func, out result))
return result;
return defaultValue;
}
}
Sie also jetzt kann dies tun:
Foo.Bar newObj;
if (!Catching<ComException>.Try(() => new Foo.Bar(), out newObj))
{
// didn't work.
}
Oder wenn Sie ein Objekt standardmäßig gespeichert in defaultMyInterface
würden Sie eine Schnittstelle zu implementieren, verwenden, wenn es nichts ist besser:
IMyInterface i = Catching<ComException>.Try(() => new Foo.Bar() as IMyInterface,
defaultMyInterface);
Sie können dies auch tun, in einem ganz anderen Szenario:
int queueSize = Catching<MyParsingException>
.Try(() => Parse(optionStr, "QueueSize"), 5);
Wenn Parse
wirft ein MyParsingException
, queueSize
-5
ausfällt, andernfalls wird der zurückgegebene Wert von Parse
verwendet wird (oder eine andere Ausnahme pflanzt sich normalerweise, die ist normalerweise, was Sie mit einer unerwarteten Ausnahme wünschen).
Dadurch wird verhindert, dass der Codefluss unterbrochen wird, und die Protokollierungsrichtlinien werden zentralisiert.
+1 zum Abfangen der spezifischen Ausnahme, insbesondere für einen Ein-Zeilen-Aufruf an eine gut dokumentierte und stabile API. –
Was meinst du damit, dass es keine Möglichkeit gibt, Ausnahmen zu vermeiden, wenn das Objekt nicht installiert ist? – Dror