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);
}
}
所以我们有了三元运算符。伟大的!然后是 ??
运算符,它对 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);
}
}