正确使用异常
Properly using exceptions
本文关键字:异常 更新时间:2023-10-16
我不确定是否完全理解异常应该如何使用。我经常在想"我应该在这里,还是在更高的调用堆栈中捕获这个?"诸如此类的问题。但是我已经创建了一个小的异常类,有一些类似c#的异常,可以显示异常堆栈:
class Exception : public std::exception
{
protected:
std::string _trace;
public:
Exception()
: _trace( "[ERROR - " + (std::string) DateTime() + "]"
{ }
Exception & push( const std::string & msg )
{
this->_trace += 'nt' + msg;
return *this;
}
virtual const char * what() const
{
return this->_trace.c_str();
}
};
我可以这样使用:
function depth0()
{
try
{
depth1();
}
catch( Exception & exc )
{
throw exc.push( "depth0() - Failed." );
}
}
function depth1()
{
try
{
depth2();
}
catch( Exception & exc )
{
throw exc.push( "depth1() - Failed." );
}
}
function depth2()
{
try
{
depth3();
}
catch( Exception & exc )
{
throw exc.push( "depth2() - Failed." );
}
}
function depth3()
{
if( something goes wrong )
{
throw Exception().push( "depth3() - Failed." );
}
}
try
{
depth0();
}
catch( Exception & exc )
{
std::cout << exc.what() << std::endl;
}
我不需要在调用栈的每个深度都进行catch和throw,这只是一个例子。
这是使用异常的正确方法吗?这不是违背了例外的哲学吗?(我还不明白)。
谢谢你:)
PS:我使用Java和c#标签,因为这是所有关于异常的一般情况,即使样本是在c++中。
作为一般规则:捕获可以处理的异常。并在可能的情况下捕获特定的异常。就像连接到数据库一样——您永远不希望用户看到一个异常——在最坏的情况下,它包含连接字符串的详细信息。因此,您的业务逻辑层必须捕获数据库异常并尽可能地处理它(再次尝试连接,记录异常等),并抛出一些前端可以保存处理的异常(自定义数据库连接异常或其他没有详细信息的异常)。
另一方面,你不能很好地处理的东西(内存不足异常或诸如此类),你可以在应用程序级别捕获并响应一些(如果可能的话,自定义但至少是通用的)信息给用户,告诉他们出了问题。如果可能的话,使应用程序进入稳定状态
相关文章:
- 处理多个异常集合的C++方法
- 我在c++代码中生成了一个运行时#3异常
- 孤立代码块在结构中引发异常
- C++中的赋值发生,尽管右侧出现异常
- 从构造函数抛出异常时如何克服内存泄漏
- 异常属于C++中的线程还是进程
- 当类定义不可见时捕获异常
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 为什么异常不退出程序?
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 是什么导致了Unity 3D中的"错误线程异常"?
- 如何将strftime中的格式错误作为异常捕获
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 尝试使用智能指针时引发异常
- 函数如何通知用户它基于函数原型抛出异常?
- 是否值得降低我的代码的可读性,以便在出现内存不足错误时提供异常安全性?
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- Pytorch torch.cholesky忽略异常