我应该如何处理来自服务层的异常

本文关键字:服务 异常 何处理 处理 我应该 | 更新日期: 2023-09-27 18:00:28

我在GUI层中使用DataAnnotations在表单中显示错误消息,但我对如何处理来自服务层的异常以及在出现异常时向用户显示什么有一些疑问。

为了与我的服务层通信,我使用了一个请求和响应类。例如:

public class RegisterUserRequest
{
    public string Username { get; set; }
    public string Password { get; set; }
    public string Email { get; set; }
}

我应该在setter方法内的请求类中检查null吗?还是我应该为自己服务?我认为在请求和响应setter方法上都这样做是有意义的,如果参数为null,则抛出ArgumentNullException

在我的服务类中,当例如用户名或密码无效时,我抛出一个InvalidOperationException。这是正确的例外吗?

我的另一个问题是,我是否应该捕获所有异常,如果是,我该如何告诉用户该异常?例如,如果某个属性为null,那么它应该抛出一个ArgumentNullException。但是我应该让用户知道这件事吗?

当用户名无效时,我抛出一个InvalidOperationException。我确实想向用户展示这个,因为它告诉用户它应该使用至少3个字符或其他什么。

我认为我应该使用InvalidOperationException中的错误消息向用户显示,并在出现其他异常时重定向到标准错误视图,例如:"哎呀,出了问题"。

我应该如何处理来自服务层的异常

当用户名或密码无效时,我认为抛出一个更相关的异常是ArgumentException。在对该异常类型的描述中,它特别涵盖了参数无效的情况。

至于将异常传递给用户,您应该尝试在不暴露任何服务内部工作的情况下通知用户错误,因此,如果有一条包含错误"无效用户名-必须至少为3个字符"的响应消息,将为他们提供有用的反馈。

对于您不想详细传递的错误,我建议您自己记录一条错误消息,然后将错误ID传递给用户。例如,"发生了未经处理的错误。请与支持部门联系,并引用错误ID xxx"。然而,这只能作为最后的手段——最好通知用户如何修复它,但这是一种在不向客户端传递太多信息的情况下捕捉所有错误的合适方法。

我只想再次使用DataAnnotations,因为如果没有为用户名或密码输入正确的格式,没有人希望重定向到错误页面。