表达式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对话框?

表达式lambda的异常处理

我同意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,而不是静态的。

关于如何显示错误,这完全取决于您的业务目的。例如,您可以简单地记录错误并告诉用户"有问题",或者向他们展示包括环境信息在内的完整堆栈跟踪,以便他们可以简单地复制&