【发布时间】: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