我遇到用户操作更改请求当前状态的情况。
根据当前状态,只能进行某些操作,例如
待批准可以被批准或拒绝或取消 已批准可以“取消请求” “取消请求”可以是“取消批准”或“取消请求”
我的问题是,如果无法执行请求的操作,我应该提出什么类型的异常?我应该使用内置异常还是应该创建一个自定义异常,例如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();
}
答案 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 { //在这里请求雕像 }