我应该抛出什么异常,我应该提供消息吗?

时间:2016-03-26 13:19:26

标签: c# exception-handling

我遇到用户操作更改请求当前状态的情况。

根据当前状态,只能进行某些操作,例如

待批准可以被批准或拒绝或取消 已批准可以“取消请求” “取消请求”可以是“取消批准”或“取消请求”

我的问题是,如果无法执行请求的操作,我应该提出什么类型的异常?我应该使用内置异常还是应该创建一个自定义异常,例如InvalidCurrentStatusException或其他类似的东西?

查看InvalidOperationException的文档似乎是一个主要的候选者,因为它是“当对象的当前状态的方法调用无效时抛出的异常”。

如果我使用自定义异常的第二个选项,那么我不需要提供消息。

如果我使用内置的InvalidOperationException,我应该提供一条消息,该消息应该是什么?

更新:

这是我目前的代码:

internal void CancelRequest(int requestID, int userID, string notes)
{

        DateTime editDate = DateTime.UtcNow;

        var request = this.FindByID(requestID, CancelRequestIncludes);

        if(request == null)
        {
            throw new ArgumentException(InvalidRequestMessage);
        }

        var currentStatus = request.LeaveRequestStatuses.Where(s => s.IsCurrent).FirstOrDefault();

        if (currentStatus.StatusID == (int)RequestStatuses.RequestPending)
        {
            SetNewRequestStatus(request, currentStatus, RequestStatuses.CancellationApproved, userID, notes, editDate);
        }
        else if (currentStatus.StatusID == (int)RequestStatuses.RequestApproved)
        {
            if (ValidApprover(request.UserID, userID))
            {
                SetNewRequestStatus(request, currentStatus, RequestStatuses.CancellationPending, userID, notes, editDate);
            }
            else
            {
                //throw an invalid approver exceptioon

            }
        }
        else
        {
            //throw exception as cant carry out cancellation
        }

        Context.SaveChanges();
}

2 个答案:

答案 0 :(得分:4)

您永远不应该使用Exception(或任何子类)来控制应用程序的状态,或指示逻辑流程。相反,您应该创建一个充当“结果”的类,在该类中添加具有“状态”的属性 - 因为其他一些已经注释枚举的是一个理想用例的主要示例。

public enum RequestStatus
{
    Approved,
    Rejected,
    Cancelled,
    UnableToCarryOut
}

public class RequestResult
{
    public RequestStatus Status { get; set; }
    public string Message { get; set; }
}

然后简单地传递一个这个对象的实例。

答案 1 :(得分:0)

在这种情况下,自定义异常将是最佳选择。你猜对了 - 应该有两种类型(正如你的意见所示)。 这些类的类应该被命名为自我描述: - InvalidApproverException - UnexpectedStatusException

两者实际上都可以被InvalidOperationException取代或者替换,但是每次都必须提供类似的异常消息。自定义异常的好处是您可以添加有关异常上下文的更多信息。具体来说,InvalidApproverException - 可以公开实际审批者的id,操作失败的人员。这可能会在以后的路上发挥作用。此外 - 它可以在内部将消息设置为某个常量字符串:类似于:“调用者不是请求的发起者”。 作为第二个异常(UnexpectedStatusException) - 我也会在其上公开CurrentRequestStatus属性,并再次出现一个常量错误消息。这只是简化了在路上的处理。以下是异常的示例代码:

public class UnexpectedStatusException:Exception {     private const string DefaultExceptionMessage =“请求未处于预期状态。”;

public LeaveRequestStatus CurrentStatus
{
    get; private set;
}

public UnexpectedStatusException(LeaveRequestStatus currentStatus) : this(currentStatus, DefaultExceptionMessage)
{
}

public UnexpectedStatusException(LeaveRequestStatus currentStatus, string message) : base(message)
{
    this.CurrentStatus = currentStatus;
}

}

public enum LeaveRequestStatus {     //在这里请求雕像 }

相关问题