表达式lambda的异常处理
本文关键字:异常处理 lambda 表达式 | 更新日期: 2023-09-27 18:08:32
我的DAL不处理异常,它将被传播到演示器类中的调用方法,在那里异常将被处理。
我使用一个称为ExecutAction(Action action)
的单一处理程序,所以我在一个地方捕获异常,而不是在每个方法中重复。
目前,我没有记录错误。只要提醒用户采取行动,并尽可能保持系统正常。
当向用户显示消息时,演示者将使用一个称为MessagingService
的静态类。( ShowErrorMessage()
)。这样我就可以在一个地方定制所有的按摩盒。
private void Search()
{
ExecutAction(() =>
{
var info = _DataService.GetByACNo(_model.AccountNumber);
if (info != null)
{
_Model = info ;
this.SetViewPropertiesFromModel(_Model, _View);
}
else
{
MessageBox.Show ("Bank account not found");
}
});
}
private void ExecutAction(Action action)
{
try
{
action();
}
catch (NullReferenceException e) { MessagingService.ShowErrorMessage(e.Message); }
catch (System.Data.SqlTypes.SqlTypeException e) { MessagingService.ShowErrorMessage(e.Message); }
catch (System.Data.SqlClient.SqlException e) { MessagingService.ShowErrorMessage(e.Message); }
}
}
我应该包括一般的异常处理程序,以能够处理任何不可预见的异常吗?
你还能告诉我一个更好的方法来处理显示消息比使用静态?
使用lambda语句在每个方法调用(ExecutAction(() =>
)降低代码的可读性?
当显示用户消息如何显示自定义消息,如"检查服务器连接"等,然后如果用户想要更多的信息(如StackTrace/技术细节),他/她可以按一个按钮,如More Info
这是在MessageBox对话框?
我同意jeffrey尝试将IoC合并到您的消息服务中。您可以为您的消息服务定义一个依赖于接口的抽象基表示器类。基类将负责处理委托执行+异常日志。
public interface IMessageService
{
void ShowErrorMessage(Exception e);
}
public abstract class PresenterBase
{
private readonly IMessageService _messageService;
public PresenterBase(IMessageService messageService)
{
this._messageService = messageService;
}
protected void ExecuteAction(Action action)
{
try
{
action();
}
catch (Exception e) { this._messageService.ShowErrorMessage(e); }
}
}
public class SearchPresenter: PresenterBase
{
public SearchPresenter(IMessageService messageService)
: base(messageService)
{
}
public void Search()
{
this.ExecuteAction(() =>
{
//perform search action
});
}
}
关于你关于捕获所有异常的问题。除非您正在为特定类型的异常做一些特殊的事情,否则我建议您以相同的方式处理所有异常。我提供的示例将异常传递给消息服务,以便您的消息服务可以处理格式化细节。
如果你还没有合并任何类型的IoC容器,你总是可以从使用接口注入开始,然后从子类构造函数显式地传递实例。
public class SearchPresenter: PresenterBase
{
public SearchPresenter()
: base(new SomeMessageService())
{
}
...
}
这至少消除了静态依赖关系,并且在以后引入IoC容器时,替换它并不太难。
我认为你的方法很适合你的工作。用ExecuteAction
包装逻辑对我来说是一种可接受的方式。作为另一种选择,我可能在实践中使用AOP来集中处理异常。
另外,我可能会使用从依赖注入容器解析的MessagingService
,而不是静态的。
关于如何显示错误,这完全取决于您的业务目的。例如,您可以简单地记录错误并告诉用户"有问题",或者向他们展示包括环境信息在内的完整堆栈跟踪,以便他们可以简单地复制&