我目前正在使用C#。
处理ASP.NET MVC 4项目我想创建一个接受各种类型方法的扩展方法,将这些方法包装在try/catch
中,然后在调用成功时返回方法调用的结果。
这是我到目前为止所做的:
public static object HandleServerError(this object obj)
{
object result = null;
try
{
result = obj;
}
catch (Exception ex)
{
ErrorHandlers.ThrowServerErrorException(ex);
}
return result;
}
以下是使用中的扩展方法的示例:
var test = webClient.DownloadString(uri).HandleServerError().ToString();
这样可行,但webClient.DownloadString(uri)
部分已执行,然后作为字符串传递到HandleServerError
,这不是我想要的。
我想要做的是对扩展方法进行INJECT webClient.DownloadString(uri)
,以便将实际的方法调用包装到try / catch中。
我意识到他们是反对try / catch语句的论据,但不打算开始讨论这个主题 - 这个问题的核心是依赖注入问题。谢谢你的所有答案!
答案 0 :(得分:3)
您需要做的是传递代理人。 Func
在这里有意义:
public static T HandleServerError<T>(Func<T> func)
{
T result = default(T);
try
{
result = func();
}
catch (Exception ex)
{
ErrorHandlers.ThrowServerErrorException(ex);
}
return result;
}
然后您可以将其称为:
int test = HandleServerError(() => 0);
或
string test = HandleServerError(webClient.DownloadString(uri));
(您仍然可以将其作为一种扩展方法,但我认为它更有意义并且更容易用作非扩展方法。)
答案 1 :(得分:3)
我唯一能想到的是:
public static T HandleServerError<T>(this Func<T> action)
{
T result = default(T);
try
{
result = (T)action();
}
catch (Exception ex)
{
ErrorHandlers.ThrowServerErrorException(ex);
}
return result;
}
然后你可以这样称呼它:
var test = new () => { return WebClient.DownloadString(uri); }.HandleServerError().ToString();
唯一的问题是你可能最终会遇到很多这样的问题,这样你就可以处理所有不同类型的需求,但也许并不是什么大问题。
答案 2 :(得分:1)
您需要为回调(Func<T>
)创建扩展方法,而不是对象。
这样的事情:
static class FuncExtensions {
public static T HandleServerError<T>(this Func<T> func) {
T result = default(T);
try {
result = func();
}
catch (Exception ex) {
// Handle exception here.
}
return result;
}
}
在使用中,它看起来像这样:
new Func<string>(() => webClient.DownloadString(uri)).HandleServerError();
但是使用常规方法调用而不是扩展方法可能会更好地实现这一切。