在c+中使用异常处理的一个小问题+; 下面给出的简单异常程序给出未处理异常“微软C++异常:内存位置0x00 12FE9..”。函数EXEP()返回后,我立即收到此错误。 请告诉我为什么会出现这个错误。此外,如果解释/分析了本规范中所有可能的错误,也会有所帮助。我正在学习更好的编码 我使用Visual C++ 2005。

在c+中使用异常处理的一个小问题+; 下面给出的简单异常程序给出未处理异常“微软C++异常:内存位置0x00 12FE9..”。函数EXEP()返回后,我立即收到此错误。 请告诉我为什么会出现这个错误。此外,如果解释/分析了本规范中所有可能的错误,也会有所帮助。我正在学习更好的编码 我使用Visual C++ 2005。,c++,visual-c++,exception-handling,C++,Visual C++,Exception Handling,#include <iostream> using namespace std; int main () { int excep(int); throw excep(20); return 0; } int excep(int e) { cout << "An exception occurred. Exception Nr. " << e << endl; return 0; } #包括 使用名称空

#include <iostream>
using namespace std;

int main ()
{
   int excep(int);

   throw excep(20);

   return 0;
}

int excep(int e)
{

    cout << "An exception occurred. Exception Nr. " << e << endl;
    return 0;

}
#包括
使用名称空间std;
int main()
{
int excep(int);
投掷练习(20);
返回0;
}
整数例外(整数e)
{

cout如果您试图学习异常抛出/处理,您的代码将包含错误。 函数EXEP必须处理抛出的对象,而不是自身抛出的对象。 您的代码必须重写如下:

using namespace std;
int excep(int e) 
{ 
       cout << "An exception occurred. Exception Nr. " << e << endl; 
       return 0;
}
int main () 
{ 
     int excep(int);
     try
     { // <--------- Begin of try block. required part of the exception handling
         throw 20;
     }
     catch (const int &errCode) // <------- we are catching only ints
     {
             excep(errCode); // Function that handles exception
     }

     return 0; 
}  
使用名称空间std;
整数例外(整数e)
{ 

你能想象会发生什么吗

你调用一个函数,它打印出“一个异常发生了”,加上其他文本,然后你把结果值作为一个异常抛出,你永远不会捕捉到它,所以程序报告抛出的不是一个未捕获的异常。这是真的,因为这正是你刚才所做的

异常的整个要点是,当您抛出异常时,它将通过程序传播出去,直到它被处理,或者到达顶层并终止程序。您不处理异常,因此它终止程序

如果要处理异常,需要将抛出代码包装在
try
块中,然后是
catch
,如下所示:

try {
    throw excep(20);
}
catch (int ex) {
   // do something about the exception
}
排队

throw excep(20);
首先调用excep(20)
,然后抛出其返回值,即抛出一个整数。它大致相当于:

const int i = excep(20);
throw i;
要了解异常snytax的外观,请执行以下操作:

#include <iostream>
#include <stdexcept>
using namespace std;

int main ()
{
   try {
       // do something
       throw std::runtime_error("test");
   } catch (const std::exception &e) {
       std::cout << "exception: " << e.what() << std::endl;
   }
}
#包括
#包括
使用名称空间std;
int main()
{
试一试{
//做点什么
抛出std::运行时_错误(“测试”);
}捕获(const std::exception&e){

std::这对困惑的提问者并没有真正的帮助。问题不是一个意外的例外,而是他把语法搞错了。@phresnel-你是读心术还是什么?OP要求纠正他的语法在哪里?@phresnel:你知道,首先,我对你的读心术感到非常惊讶。特别是考虑到OP从字面上说,我没有捕捉异常的语法,我发现很难同意“他只是把语法搞错了”的说法。问题是他抛出了一个他没有捕获到的异常。解决方法是了解异常处理是如何工作的。如果我错了,请纠正我,但我相信我的回答也说明了语法,所以我甚至不确定你在抱怨什么。@DumbCoder(CC@Jalf):他/她没有,这正是问题所在;这在某种程度上意味着OP假定某些内容是正确的,并且正在某个正交主题中查找错误。源代码imho self记录了
execp()
应该是一个异常处理程序:
发生异常。异常编号
。我怀疑
execp
是否是一个“装饰者”我读了代码,是由一个没有经验的C++程序员编写的。谢谢Jalf,我试过这种方法,我记得我读了很久,编译器将把代码重写为TestCcatch块,所以我只是试验了一下,我认为它工作得很好,但是为什么内存异常会出现在int中。现在我假设我错了。hresnel-想解释吗?@phresnel-现在你说得很含糊。你不解释你的意思,然后劫持主题。在指责别人时最好保持理智。在指责别人之前提出你的观点。不必愚蠢。这是一个评论部分而不是回答部分。如果你y OP认为他正在捕获一个异常,而感叹号是什么时候变得粗鲁的?@phresnel:我在这些评论中只看到一个人过度使用感叹号。我想说,如果你认为你的异常正在被捕获,被告知这不是纠正问题的非常好的第一步。另外,你能接受吗“比你更神圣”的态度,并把它坚持在没有阳光的地方?你可以说你想说的话,而不需要“不像你”“胡说。噢,我可以知道为什么这个问题得到-1吗flag@DumbCoder:是的。只有哪本书?至于感叹号:我觉得一本就足够了。不止一本书会读起来像是喊叫、命令、咆哮、谩骂,或者只是孩子气。虽然这是我读过之后的感受,但一些文章证实了这一点:,(搜索感叹号),。谢谢弗雷斯内尔,我得到了我错过的要点。谢谢你的参考