7

如果遇到这样的逻辑错误错误(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";
4

5 回答 5

4

更好的方法是抛出自定义异常。这就是他们被介绍的原因。如果您需要提供特定信息,例如ErrorCode或其他内容,您可以轻松扩展基Exception类来执行此操作。主要原因是:

  • 您可以忽略从您的函数返回的无效错误代码,这可能会导致您的系统状态已损坏,而Exception这是您无法忽略的情况。
  • 如果你的函数做了一些有用的事情,那么它应该返回一些你感兴趣的数据而不是错误代码,这会给你更可靠的设计。
于 2013-04-08T07:25:00.807 回答
3

如果遇到诸如(过期用户,无效ID)之类的逻辑错误错误,那么告诉父方法此错误的最佳方法是什么

  1. 由于您希望父方法知道错误,因此在调用该方法之前您不确定它ID是否有效并且User未过期。GetUser对?

  2. 如果您不确定传递给函数的参数是否有效,则使用异常是不合理的,您应该返回错误信息。

  3. 您可以以类似于 Scala、Go 和 Rust 语言所建议的更实用的方式返回错误信息。

创建一个泛型类以返回错误或值

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

创建您的函数可能具有的错误的枚举

public enum UserError
    InvalidUserID
    UserExpired
end enum

创建一个将用户 ID 作为参数并返回错误或用户的函数

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

在调用者(父)方法中检查错误并应用业务逻辑

dim UserID = 10
dim UserResult = GetUser(10)

if UserResult.Success then
    rem apply business logic to UserResult.Value
else
    rem apply business logic to UserResult.Error
end if

注意:如果您使用异常重写此代码,您将获得完全相同数量的代码。

于 2015-10-31T23:35:19.087 回答
2

在大多数情况下,您应该抛出异常。这是标准异常还是自定义异常取决于上下文,但与流程无关。

抛出异常会强制任何实现相应地处理不良数据。如果您依赖实现来检查属性值以进行正确处理,那么迟早会遇到意外的、更难调试的异常。

于 2013-04-08T07:27:03.023 回答
2

我想你应该使用例外,因为它是准确的,它们是做什么的。您可以将相同的信息放在那里,就像在第二种情况下一样。但是第 1 次和第 2 次之间的区别在于,您让函数使用者有可能被告知有问题,并且必须以某种方式进行处理。在第二种情况下,您只是说该功能有效,但是出了点问题,用户可以处理此信息

于 2013-04-08T07:27:25.080 回答
0

这完全取决于您项目的工作流程。如果这是一个意外的运行计时器错误并且它禁止您的程序,那么异常是一个不错的选择,但对于简单的输入检查和预期的输出,您应该使用枚举器

于 2013-04-08T07:28:58.240 回答