【问题标题】:Beginner how to handle exception caused by user input being of incorrect type初学者如何处理用户输入类型不正确导致的异常
【发布时间】:2012-04-05 16:24:21
【问题描述】:

这篇文章可能与常见的关于 c++ 异常的问题有点不同。

在 C++ 中,有人如何处理用户输入错误,特别是当用户被提示输入整数并且他们输入浮点数或字符串/字符时,反之亦然。就像有人在被提示输入年龄时输入他们的名字一样。

我基本上是在谈论 C++ 中的内容与 Python 中的内容类似:

try:
[code to prompting user for an integer.]
exception ValueError:
[code to run if exception is thrown.]

如果你们中的一个很棒的人有空闲时间以一种初学者能够理解的方式向我解释这一点,那将是非常感激的人。

谢谢。

【问题讨论】:

  • 这个问题还可以,但可以更精确,也可以少一些笨拙。如果可以,请尝试询问确切的点。避免大量的细节。 尽量避免除了问题之外的不必要的事情(问题的最后 3 段,也可能是第 1 段)
  • 出现输入错误怎么办?保持循环直到你得到你想要的东西而不是使用异常可能更容易。

标签: c++ exception-handling


【解决方案1】:

您可以使用简单的 if..else 循环进行简单的用户输入验证。您可以以非常相似的方式使用异常

例如

try {
      ...code that can generate the error...
   } catch (some_exception& e) {
     ...code that handles the error...
   }

【讨论】:

    【解决方案2】:

    在 C++ 中使用 try-catch 块处理异常。异常处理是 C++ 相对于 C 的一项改进功能。异常处理可防止程序因未知错误而崩溃。

     try
        {
             //code to be tried
        }
        catch(Exception& e)
        {
              //make user understand the problem
          throw [expression]
        }
    

    您可以阅读MSDN page 或者为了基本的了解你可以阅读this

    【讨论】:

    • 异常处理可防止程序因未知错误而崩溃&通过异常处理隐藏此类场景而不是解决它们是一种非常糟糕的做法。
    • @Als: 捕获的异常也会被抛出。这值得特别一提吗? ;-)
    • 捕捉到的异常也会被抛出 请告诉为什么?你在throwing 狂热吗?如果你能处理异常一旦你catchit 为什么你想再次throw它?
    • 哦,不。有点着急。当 try 块中出现异常情况时,会引发异常,将控制权转移到异常处理程序。可以吗
    • 出现异常情况时导致调用throw someThing;,没有调用throw的异常情况实际上没有任何作用。
    【解决方案3】:

    try catch 的基本示例是这样的:

    try
    {
        // code that throws an exception
    }
    catch(...)
    {
        // exception handling
    }
    

    请注意,这三个点对于捕获所有异常是完全有效的,尽管您不知道您捕获的是“什么”。这就是为什么您应该更喜欢在括号中指定类型。

    要捕获的异常可以是从 int 开始并以指向从异常类派生的对象的指针结尾的任何类型。这个概念非常灵活,但是您必须知道可能会发生什么异常。

    这可能是一个更具体的例子,使用 std::excpetion:注意通过引用捕获。

    try
    {
        throw std::exception();
    }
    catch (const std::exception& e)
    {
        // ...
    }
    

    下一个示例假设您使用 MFC 库编写 C++。它阐明了执行 CException catch 是因为 CFileException 派生自 CException。如果不再需要,CException 对象会自行删除。除非您的异常源自 CException,否则您不应抛出指针并坚持上面的示例。

    try
    {
        throw new CFileException();
    }
    catch (CException* e)
    {
        // CFileException is caught
    }
    

    最后但并非最不重要的一点也很重要:您可以定义多个 catch 块来捕获不同的异常:

    try
    {
        throw new CFileException();
    }
    catch (CMemoryException* e)
    {
        // ignore e
    }
    catch (CFileException* e)
    {
        // rethrow exception so it gets handeled else where
        throw;
    }
    catch (CException* e)
    {
        // note that catching the base class should be the last catch
    }
    

    【讨论】:

    • 您应该始终按值抛出并按引用捕获。
    • 通过const 参考(通常)更准确地捕获。
    • 你说得对,我更新了我的帖子,指出这应该只针对 MFC CException 对象。
    • 每次我发现关于 MFC 的新东西(我从未使用过)时,我都会脸红。说真的,怎么会这么
    • @MatthieuM。我不想找任何借口,但提供信息:如果这是正确的stackoverflow.com/a/2023134/426662 MFC 在标准化之前支持某种 try/catch。在 1994/95 与 MFC 3.0 的某个地方,他们将其更改为使用 C++ try catch,但也希望与他们的旧方法兼容,该方法显然使用堆分配的对象。如果他们放弃它会很好,很多程序员可能会有不同的想法,因为他们不需要更新他们的代码。
    【解决方案4】:

    您可以自己从基本 Exception 类继承来拥有自己的 Exception 类型,或者使用准备好的 Exception 类,就像我的朋友们提出的那样。 关于您的案例,您可能需要提供一个基于基本异常类的异常来 首先评估输入,如果不满足您想要的条件,则抛出您编写的异常。 像这样:

    class myException:Exception {
    ...
    }
    
    int evaluateInput(input) {
     if
     ...
     else
      throw myException;
    }
    
    // Get input from user
    
    try:
     cin>>input;
     evaluateInput(input);
    catch(myException)
     doWhatYouWant;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-25
      • 1970-01-01
      • 2017-08-27
      • 2013-12-11
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多