A try-catch one liner(如“??”或三元运算符)

A try-catch one liner (like "??" or ternary operator)

所以我们有了三元运算符。伟大的!然后是 ?? 运算符,它对 nullable 变量进行合并。

示例:

string emptyIfNull = strValue ?? "";

问题:是否可以为 try-catch 实现这样一个简单的运算符?

示例:

string result = CoalesceException(someExpression, "");

public static T CoalesceException<T>(expression, defaultValue)
{
    try
    {
        return evaluate expression; // ?
    }
    catch
    {
        return defaultValue;
    }
}

是否可以实现一种尽可能容易使用的方法,甚至是某种类似合并的运算符?

您可以:

public static T CoalesceException<T>(Func<T> func, T defaultValue = default(T))
{
    try
    {
        return func();
    }
    catch
    {
        return defaultValue;
    }
}

但我不确定这是否是您想要的...

使用:

string emptyIfError = CoalesceException(() => someExpressionThatReturnsAString, "");

例如...

string shortString = null;

string emptyIfError = CoalesceException(() => shortString.Substring(10), "");

将return""代替NullReferenceException

重要

如所写,该函数将始终导致 defaultValue 的 "evaluation"。含义:

string Throws() { throw new Exception(); }

string str1 = somethingTrue == true ? "Foo" : Throws();

这里不会抛出异常,因为Throws()不会被求值。 ?? 运算符也是如此。

string str2 = CoalesceException(() => ((string)null).ToString(), Throws());

在进入 CoalesceException 之前导致异常。解决方案:

public static T CoalesceException<T>(Func<T> func, Func<T> defaultValue = null)
{
    try
    {
        return func();
    }
    catch
    {
        return defaultValue != null ? defaultValue() : default(T);
    }
}

使用:

string emptyIfError = CoalesceException(() => someExpressionThatReturnsAString, () => "");

这是我最后做的一些事情,创建一个 One Liner TryCatch

用法

  var r = Task.TryCatch(() => _logic.Method01(param1, param2));

TryCatch 定义

public static class Task
{

    public static TResult TryCatch<TResult>(Func<TResult> methodDelegate)
    {
        try
        {
            return methodDelegate();
        }
        catch (Exception ex)
        {
            // .. exception handling ...
        }

        return default(TResult);
    }
}