我需要在第三方库清理操作中捕获分段错误.这有时会在我的程序退出之前发生,我无法解决这个问题的真正原因.在Windows编程中,我可以使用__try - __catch执行此操作.是否有跨平台或平台特定的方式来做同样的事情?我需要在Linux,gcc中使用它.
我有一个应用程序,我用它来捕获任何分段错误或ctrl-c.使用下面的代码,我能够捕获分段错误,但是一次又一次地调用处理程序.我怎么能阻止他们.为了您的信息,我不想退出我的申请.我只需要注意释放所有损坏的缓冲区.
可能吗?
void SignalInit(void )
{
struct sigaction sigIntHandler;
sigIntHandler.sa_handler = mysighandler;
sigemptyset(&sigIntHandler.sa_mask);
sigIntHandler.sa_flags = 0;
sigaction(SIGINT, &sigIntHandler, NULL);
sigaction(SIGSEGV, &sigIntHandler, NULL);
}
和处理程序是这样的.
void mysighandler()
{
MyfreeBuffers(); /*related to my applciation*/
}
这里对于Segmentation故障信号,处理程序被多次调用,很明显,MyfreeBuffers()给了我释放已经释放的内存的错误.我只想释放一次,但仍然不想退出应用程序.
请帮忙.
我可以获得被捕获的异常的描述吗?
catch(...)
块?像std :: exception的.what()之类的东西.
问题:如果我想要的只是显示错误消息并关闭(假设我可能在程序中很深),是否正确使用异常来终止我的程序?我可以只显式调用exit()这样的东西吗?
我目前在做什么:
我正在开发一个游戏项目,并试图找出在需要执行此类操作的错误的情况下终止程序的最佳方法.例如,在无法加载纹理的情况下,我显示错误消息并终止程序.
我目前正在这样做,例如:
int main()
{
   Game game;
   try
   {
       game.run();
   }
   catch (BadResolutionException & e)
   {
       Notification::showErrorMessage(e.what(), "ERROR: Resolution");
       return 1;
   }
   catch (BadAssetException & e)
   {
       Notification::showErrorMessage(e.what(), "ERROR: Assets");
       return 1;
   }
   catch (std::bad_alloc & e)
   {
       Notification::showErrorMessage(e.what(), "ERROR: Memory");
       return 1;
   }
   return 0;
}
除了bad_alloc之外的所有内容都是我自己定义的从runtime_error派生的异常.
我不需要任何手动资源清理,我使用std :: unique_ptr进行任何动态分配.我只需要显示错误消息并关闭程序.
研究/替代例外:
我在SO和其他地方查了很多帖子,并且看到其他人说不要使用例外,使用例外,但你使用它们是错误的.我也查找过显式调用exit()之类的东西.
使用exit()听起来不错,但是我看到它不会通过调用堆栈返回主要清理所有内容(如果我能再次找到这个,我会发布链接).此外,根据http://www.cplusplus.com/reference/cstdlib/exit/,如果多个线程处于活动状态,则不应使用此选项.我确实希望在短时间内创建第二个线程至少一次,并且该线程可能会发生错误.
这里有一些关于游戏的回复中提到了不使用例外的问题https://gamedev.stackexchange.com/questions/103285/how-industy-games-handle-their-code-errors-and-exceptions
这里讨论了使用例外情况:http://www.quora.com/Why-do-some-people-recommend-not-using-exception-handling-in-C++
我读过其他一些资料,但那些是我最近看过的资料.
个人结论:
由于我处理错误处理和使用异常的经验有限,我不确定我是否走在正确的轨道上.我根据上面发布的代码选择了使用异常的路线.如果您同意我应该解决这些例外情况,我是否正确使用它?
就像标题所说,我们正在寻找一种方法来捕获一段C++代码中的所有异常,并将其包装在一个DLL中.这样我们可以屏蔽使用此dll的应用程序,从此dll中发生的任何错误.
但是,在Windows下使用C++似乎不太可行.
例:
void function()
{  
    try  
    {    
        std::list<int>::iterator fd_it;
        fd_it++;  
    } catch(...) {}
}
发生的异常不是由标准C++ try/catch块捕获的,也不是由设置的任何SEH转换器函数捕获的_set_se_translator().相反,DLL崩溃,并且使用DLL的程序被中止.我们使用Visual C++ 2005编译,使用选项/ SHa.有谁知道在C++/Win32中是否可以捕获这些问题并制作一个rockolid DLL包装器?
据我所知,c ++中的所有异常最终都会扩展exception.在Java世界中,Exception e无论Exception的类型如何,catch 都会起作用.这是如何在C++中完成的?
为什么没有捕获此片段异常?
try{        
    int z = 34/0;
    cout << "This line should not appear" << endl;
} catch (exception e) {
    cout << "An error has occurred: " << e.what();  // Not executed
}
另外,在C++中,如何找出导致什么异常的动作?
通过引用C++捕获所有异常
try {
    int i = 0;
    int j = 0/i; /* Division by  0 */
    int *k = 0;
    std::cout << *k << std::endl;  /* De-reference invalid memory location. */
}
catch (...) {
    std::cout << "Opps!" << std::endl;
}
无法检测到上述运行时错误.或者,我对C++异常处理功能有错误的期望吗?
是否可以使用省略号try-catch来捕获可能导致崩溃的所有错误?有异常吗?
try
{
//some operation
}
catch(...)
{
}
我有一些代码来对对象的矢量进行排序.如果任何对象无效,我想立即停止排序并报告错误.在错误中,我想要包含无效对象的描述(无论哪一个有多少).
这是我的代码(不完整,但我希望你能跟着我):
int sortProc(const Bulk & b1, const Bulk & b2) {
    if (!b1.isValid()) throw b1;
    if (!b2.isValid()) throw b2;
    return b1.compareTo(b2);
}
vector<Bulk> * items = getItems();
try {
    sort(items->begin(), items->end(), sortProc);
} catch (const Bulk & item) {
    cout << "Cannot sort item: " << item.description();
}
现在,我对我的代码有点不确定,因为我听说所有异常都应该是异类的子类,并且抛出不是异常实例的对象被认为是不好的做法,但我真的不明白为什么.我上面的代码有效,它有什么问题吗?这是一个严肃的问题,所以如果你看到任何问题,我会很高兴知道.我不是在寻找道德问题.
在 try catch 语句中,我们可以执行以下操作:
try{}
catch(...){}
据我所知,...意味着任何例外。
我的问题是:为什么 C++ 标准选择这种方式(...)而不是仅仅选择这种方式()?而例如,在函数中,如果您不需要参数,您只需输入():
void foo();
它与可变参数模板有任何关系吗?
我有一个Foo类,如下所示
Foo.h
#pragma once
class Foo
{
public:
    Foo() = default;
    ~Foo() = default;
    void DoSomething();
};
Foo.cpp
#include "Foo.h"
void Foo::DoSomething()
{
    throw "something happened";
}
我使用的类如下:
#include <iostream>
#include "Foo.h"
int main()
{
    try
    {
        Foo foo;
        foo.DoSomething();
    }
    catch (std::exception& e)
    {
        std::cout << e.what() << std::endl;
    }
}
我希望代码进入catch块.但是,它永远不会进入那里.我在这做错了什么?