【问题标题】:Throw correct type of exception抛出正确类型的异常
【发布时间】:2018-07-31 19:42:39
【问题描述】:

例如,我有一个方法服务,它从源中获取一些数据,对这些数据做一些事情并返回给服务的客户端:

DriverProfilerInfoDomain GetDriverProfilerInfo(int id);

实施的第一行:

    public DriverProfilerInfoDomain GetDriverProfilerInfo(int id)
    {
        var driver = (from i in _db.Drivers
                      where i.Id == id
                      select ....)

但驱动程序可以为空(从客户端传递的 id 无效)。抛出什么异常会更好?我抛出 NullReferenceException ,但可能应该像 ArgumentException ? 来自文档:

https://docs.microsoft.com/en-us/dotnet/standard/exceptions/best-practices-for-exceptions

抛出 ArgumentException 异常或预定义类之一 如果传递了无效参数,则派生自 ArgumentException。

所以,无效的 id 是无效的参数。但是具体的类型是什么? ArgumentNullException?

https://docs.microsoft.com/ru-ru/dotnet/api/system.argumentnullexception?view=netframework-4.7.2

空引用时抛出的异常(Visual 中的Nothing Basic) 被传递给一个不接受它作为有效的方法 论据。

但是传递的参数不是空的,它只是在源代码中“找不到”......

有什么想法吗?

【问题讨论】:

  • 为什么不抛出自己的自定义类型异常?
  • @Sach 创建自己的自定义类型有什么意义,如果 MS 建议使用预定义的
  • @OlegSh MS 还建议避免抛出异常,例如,您可以提供一个Exists 方法,该方法允许客户端在将 id 传递给此方法之前对其进行验证。如果 .NET 框架例外都没有涵盖您的情况,那么您别无选择,只能自己动手。另见:stackoverflow.com/questions/1453200/exception-for-missing-data
  • @LennartStoop “例如,您可以提供一个 Exists 方法,该方法允许客户端在将 id 传递给此方法之前对其进行验证。”但随后将是 2 个对 db 的请求,而不是 1 个,并且代码会更复杂...

标签: c# exception architecture parameter-passing


【解决方案1】:

如果你关心你的调用者,你可以通过引发 ArgumentException 让他们知道发生了什么:

   throw new ArgumentException($("{id} is not valid driver id."),"id");

您不需要更具体的类型来指示参数无效。

ArgumentException 优于 NullReferencException 的好处是调用者更清楚发生了什么:

Object reference not set to an instance of an object

没有这个意义

42 is not a valid driver id. Parameter name: id

但是,在很多情况下,只需让NullReferenceException 发生就可以了,无需自己引发任何异常。当您访问 null 对象时,运行时将为您引发 NullReferenceException。

【讨论】:

  • "当您访问空对象时,运行时将为您引发 NullReferenceException。" - 因此我选择了 NullReferenceException。在很多情况下,它会自动抛出同样的原因,不需要编写任何代码......
猜你喜欢
  • 2015-05-07
  • 1970-01-01
  • 1970-01-01
  • 2011-02-13
  • 2022-01-01
  • 1970-01-01
  • 2021-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多