从函数返回错误消息的最佳方法是什么?

时间:2013-04-08 07:22:29

标签: c# .net

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

5 个答案:

答案 0 :(得分:3)

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

  • 您可以忽略从您的函数返回的无效错误代码,这可能会导致您的系统状态已损坏,而Exception是您无法忽略的。
  • 如果您的功能可以使用,那么它应该返回您感兴趣的一些数据,而不是错误代码,这样可以为您提供更加可靠的设计。

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

我想你应该使用例外,因为它是准确的,它们的用途是什么。您可以在第二种情况下提供相同的信息。但是,第1和第2之间的区别在于,您可以让您的功能消费者有可能被告知错误,并且必须以某种方式处理。在第二种情况下,你只是说功能有效,但有些不对劲,用户 MAY 处理这些信息

答案 3 :(得分:1)

  

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

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

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

  3. 您可以返回更多功能方式的错误信息,类似于Scala,Go和Rust语言的建议。

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

    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)

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