让我给你举个例子。我的 aspx.cs 文件中有以下 Web 方法,用于 AJAX 调用:
[WebMethod]
public static ResponseMessage GetNextQuestion(string quizGuid)
{
using (DbEntities db = new DbEntities())
{
Quiz theQuiz = Quiz.Get(db, DataValidationHelper.GetGuid(quizGuid));
try
{
Question nextQuestion = QuizHelper.GetNextQuestion(db, theQuiz);
return new ResponseMessage() { Status = "Success", NextQuestion = new NextQuestionResponse(nextQuestion, theQuiz) };
}
catch (QuizNotFoundException)
{
return new ResponseMessage() { Status = "QuizNotFound" };
}
catch (QuizInvalidException)
{
return new ResponseMessage() { Status = "QuizInvalid" };
}
catch (QuizOverException)
{
return new ResponseMessage() { Status = "QuizOver" };
}
catch (QuestionTimedOutException)
{
return new ResponseMessage() { Status = "QuestionTimedOut" };
}
catch (Exception ex)
{
return new ResponseMessage() { Status = "Error", ErrorMessage = ex.Message };
}
}
}
该QuizHelper.GetNextQuestion
方法从数据库生成一个新问题,在某些特定情况下会引发以下异常:
QuizNotFoundException
:当quizGuid
在数据库中找不到给定的测验时。QuizInvalidException
: 出于安全目的而抛出,例如当有人试图破解 HTTP 请求时。QuizOverException
:每个测验有 10 个问题,当用户尝试使用该QuizHelper.GetNextQuestion
方法获得第 11 个问题时,会抛出此异常。QuestionTimedOutException
: 你必须在给定的时间内回答一个问题。如果不这样做,则会引发此异常。Exception
:所有其他例外情况都在此分组,其唯一目的是通知用户发生错误,用于 UX 目的。
然后在 Javascript 文件中,ResponseMessage.Status
检查并采取相应的措施。
我知道在此代码中使用异常来控制流程是不好的,但是以这种方式进行操作更直观且更简单。更不用说代码对于外人来说更容易理解的事实。
我不确定如何以“正确的方式”毫无例外地重写此代码,但同时保持其简单性。
我错过了什么,有什么想法吗?
更新:一些答案建议使用枚举来返回操作的状态,但我有很多操作,它们都可能导致不同的场景(即我不能对所有操作使用相同的枚举)。在这种情况下,每个操作创建一个 Enum 感觉不是正确的方法。对这个模型有什么改进吗?