我今天想到了另一种语言中存在的try/catch块.谷歌搜索了一段时间,但没有结果.据我所知,在C中没有try/catch这样的东西.但是,有没有办法"模拟"它们?
当然,有断言和其他技巧,但没有像try/catch,也可以捕获引发的异常.谢谢
例
int *ptr;
*ptr = 1000;
Run Code Online (Sandbox Code Playgroud)
我可以使用标准C++捕获内存访问冲突异常,而无需使用任何特定的Microsoft.
在Java中,如果特定的代码行导致程序崩溃,则捕获异常并继续执行程序.
但是,在C++中,如果我有一段导致程序崩溃的代码,例如:
try
{
int x = 6;
int *p = NULL;
p = reinterpret_cast<int*>(x);
*p = 10; // the program crashed here
cout << "x = " << *p << endl;
}
catch(const char* Message)
{
cout << "There is an run-time error";
}
Run Code Online (Sandbox Code Playgroud)
然后程序仍然崩溃,并且没有捕获异常.
那么C++中的异常处理有什么意义呢?我误会了什么吗?
在我的项目中,我找到了一段代码,其中一个方法在构造函数的初始化列表中被调用.
Test2(Test* pTest):m_pTest(pTest), m_nDuplicateID(pTest->getTestID())
{
}
Run Code Online (Sandbox Code Playgroud)
我发现Test2的用户可能会将NULL传递给构造函数.由于指针在未经验证的情况下使用,因此存在访问冲突的可能性.
这引发了我在构造函数的初始化列表中查看异常处理.我在其中一篇文章中发现尝试可以在初始化列表中使用.我写了一个小测试程序来测试这个概念:
//Test class stores the unique ID and returns the same with API getTestID
class Test
{
public:
Test(int nID):m_nID(nID){
}
int getTestID() const
{
return m_nID;
}
private:
int m_nID;
};
class Test2
{
public:
Test2(Test* pTest)
try :m_pTest(pTest), m_nDuplicateID(pTest->getTestID())
{
}
catch (...)
{
cout<<"exception cought "<< endl;
}
void printDupID()
{
cout<<"Duplicate ID" << m_nDuplicateID << endl;
}
private:
Test* m_pTest;
int m_nDuplicateID;
};
int main(int argc, char* argv[])
{ …Run Code Online (Sandbox Code Playgroud) 我有一个基于Romain Guy的例子的TextureView,可以在这里找到.在Android 4.3和4.4上,经过几轮暂停和恢复应用程序后,应用程序崩溃,唯一的错误痕迹是LogCat中的致命信号11.我创建了一个测试应用程序,它使用Romain Guy的确切代码来查看它是否是我在代码中所做的事情,而Romain的代码也与致命信号11一起崩溃.
我已经确定,如果我使用Handler而不是Thread运行代码,它似乎不会使应用程序崩溃.Handler应该在主UI线程上运行(或者至少我相信它),这可能暗示它是一个线程问题.
我还确定在调用canvas.drawX(drawColor,drawBitmap,drawRect等等)期间发生了崩溃.锁定和解锁画布似乎不是问题.我怀疑线程正在被取消,而其他一些代码仍在使用画布,但由于缺少任何真正的异常并且崩溃相当不一致,我很难跟踪问题.
任何见解将不胜感激.
我想编写一个守护程序管理器来管理所有守护程序正在运行,就像这样(简化的伪代码):
void watchMe(filename)
{
while (true)
{
system(filename); //freezes as long as filename runs
//oh, filename must be crashed. Nevermind, will be restarted
}
}
int main()
{
_beginThread(watchMe, "foo.exe");
_beginThread(watchMe, "bar.exe");
}
Run Code Online (Sandbox Code Playgroud)
这部分已经工作 - 但是现在我面临的问题是,当观察到的应用程序 - 比如说foo.exe - 崩溃时,相应的系统调用会冻结,直到我确认这个漂亮的消息框:

这使守护进程无用.
我认为可能是一个解决方案是使观察到的程序(我控制)的main()"不可擦除",这样他们就可以优雅地关闭而不显示这个丑陋的消息框.
像这样:
try
{
char *p = NULL;
*p = 123; //nice null pointer exception
}
catch (...)
{
cout << "Caught Exception. Terminating gracefully" << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为它仍然会产生此错误消息:

("未经处理的异常...写入访问冲突......")
我已经尝试了SetUnhandledExceptionFilter和所有其他东西,但没有效果.
任何帮助将受到高度赞赏.
电贺
我试图抓住指针异常.我的代码看起来像这样.我得到"未处理的例外".我做错了什么?任何帮助将不胜感激.
#include <iostream>
#include <exception>
using namespace std;
struct Node{
int data;
Node* next;
};
int list_length(struct Node* head){
try{
int i = 0;
while (head->next){
head = head->next;
i++;
}
return i + 1;
}
catch (exception& e){
cout << e.what() << endl;
}
};
int main(void){
struct Node *perr = nullptr;
list_length(perr);
return 0;
}
Run Code Online (Sandbox Code Playgroud)