gpt4 book ai didi

c# - 使用异常来控制程序流程

转载 作者:太空宇宙 更新时间:2023-11-03 10:58:39 25 4
gpt4 key购买 nike

让我举个例子。我的 aspx.cs 文件中有以下用于 AJAX 调用的 Web 方法:

[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 方法从数据库生成一个新问题,在某些特定情况下会抛出以下异常:

  1. QuizNotFoundException:当在数据库中找不到具有给定 quizGuid 的测验时。
  2. QuizInvalidException:出于安全目的抛出,例如当有人试图破解 HTTP 请求时。
  3. QuizOverException:每个测验都有 10 个问题,当用户尝试使用 QuizHelper.GetNextQuestion 方法获得第 11 个问题时,将抛出此异常。
  4. QuestionTimedOutException:您必须在给定时间内回答问题。如果不这样做,则会抛出此异常。
  5. Exception:出于 UX 目的,所有其他异常都归入此组,其唯一目的是通知用户发生了错误。

然后在 Javascript 文件中,检查 ResponseMessage.Status 并采取相应的操作。

我知道在这段代码中使用异常来控制流程是不好的,但这样做更直观也更简单。更不用说代码对于局外人来说更容易理解了。

我不确定如何以“正确的方式”无一异常(exception)地重写这段代码,同时保持其简单性。

我是否遗漏了什么,有什么想法吗?

更新:一些答案​​建议使用枚举来返回操作的状态,但我有很多操作,它们都可能导致不同的场景(即我不能对所有操作使用相同的枚举).在这种情况下,为每个操作创建一个 Enum 感觉不是正确的方法。这个模型有什么改进吗?

最佳答案

你会。 G。使用枚举 Quiz.Status 并更改

Question nextQuestion = QuizHelper.GetNextQuestion(db, theQuiz)

Question nextQuestion;
Quiz.Status status = QuizHelper.TryGetNextQuestion(db, theQuiz, out nextQuestion);
switch(status) {
case QuizNotFoundException:
return new ResponseMessage() { Status = "QuizNotFound" };
// ...
}

甚至简化为

Question nextQuestion;
Status status = QuizHelper.TryGetNextQuestion(db, theQuiz, out nextQuestion);
if(status != Status.ok) {
return new ResponseMessage() (Status = status);
}

避免不同案例的长级联。

关于c# - 使用异常来控制程序流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18520407/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com