如果遇到逻辑错误错误(Expired user, invalid ID)
,那么从以下方面告诉父方法此错误的最佳方法是什么:
1-抛出自定义异常,如下所示:
try
{
//if (ID doesn't match) then
Throw new CustomException(-1,"ID doesn't match");
}
catch(CustomException ex)
{
throw ex
}
catch(Exception ex)
{
throw new CustomException(ex.ErrorCode,ex.message);
}
2-返回错误消息和代码如:
//if (ID doesn't match) then
This.ErrorCode= -1;
This.Message= "ID doesn't match";
答案 0 :(得分:3)
更好的方法是抛出自定义异常。这就是他们被介绍的原因。如果您需要提供特定信息,例如ErrorCode
或其他内容,则可以轻松扩展基本Exception
类来执行此操作。主要原因是:
Exception
是您无法忽略的。 答案 1 :(得分:2)
在大多数情况下,您应该抛出异常。这是标准还是自定义异常取决于上下文,但与过程无关。
抛出异常会强制任何实现相应地处理错误数据。如果您依赖实现来检查属性值以进行正确处理,那么迟早会遇到意外的,更难调试的异常。
答案 2 :(得分:2)
我想你应该使用例外,因为它是准确的,它们的用途是什么。您可以在第二种情况下提供相同的信息。但是,第1和第2之间的区别在于,您可以让您的功能消费者有可能被告知错误,并且必须以某种方式处理。在第二种情况下,你只是说功能有效,但有些不对劲,用户 MAY 处理这些信息
答案 3 :(得分:1)
如果遇到逻辑错误错误(过期用户,无效ID),那么告诉父方法此错误的最佳方法是什么
由于您希望父方法知道错误,因此在您调用{{1}之前,它确定您不确定ID
是否有效并且User
未过期} 方法。右
如果您不确定传递给函数的参数是否有效,那么使用异常是不合理的,您应该返回错误信息。
您可以返回更多功能方式的错误信息,类似于Scala,Go和Rust语言的建议。
创建一个泛型类以返回错误或值
GetUser
创建函数可以包含的错误枚举
public class Either(of ErrorType, ValueType)
public readonly Success as boolean
public readonly Error as ErrorType
public readonly Value as ValueType
public sub new(Error as ErrorType)
me.Success = False
me.Error = Error
end sub
public sub new(Value as ValueType)
me.Success = True
me.Value = Value
end sub
end class
创建一个将用户ID作为参数并返回错误或用户
的函数public enum UserError
InvalidUserID
UserExpired
end enum
在调用者(父)方法中检查错误并应用业务逻辑
function GetUser(ID as integer) as Either(of UserError, User)
if <business logic to find a user failed> then
return new Either(of UserError, User)(UserError.InvalidUserID)
end if
if <user expired> then
return new Either(of UserError, User)(UserError.UserExpired)
end if
return new Either(of UserError, User)(User)
end function
注意:如果使用Exceptions重写此代码,您将获得完全相同的代码量。
答案 4 :(得分:0)
这完全取决于项目的工作流程。如果是一个意外的运行计时器错误并且它禁止你的程序,那么异常是一个不错的选择,但对于简单的输入检查和可预期的输出你应该使用枚举器