- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在编译器 MSVC、GCC、Clang 或它们的通用包装器中是否有捕获异常的通用解决方案,例如被零除、段错误等,可能在“boost”库中?
当然必须是基于每个编译器的细微差别的通用解决方案。即使我确实在每个编译器下编写了类似的解决方案,我仍然可以离开并忘记任何细微差别。例如,我可以使用 SEH 异常在 MSVC 中编写并使用 key 编译它:/ZHa
#include<iostream>
#include<string>
#ifdef _MSC_VER
#include <windows.h>
#include <eh.h>
class SE_Exception
{
private:
EXCEPTION_RECORD m_er;
CONTEXT m_context;
unsigned int m_error_code;
public:
SE_Exception(unsigned int u, PEXCEPTION_POINTERS pep)
{
m_error_code = u;
m_er = *pep->ExceptionRecord;
m_context = *pep->ContextRecord;
}
~SE_Exception() {}
unsigned int get_error_code() const { return m_error_code; }
std::string get_error_str() const {
switch(m_error_code) {
case EXCEPTION_INT_DIVIDE_BY_ZERO: return std::string("INT DIVIDE BY ZERO");
case EXCEPTION_INT_OVERFLOW: return std::string("INT OVERFLOW");
// And other 20 cases!!!
}
return std::string("UNKNOWN");
}
};
void trans_func(unsigned int u, EXCEPTION_POINTERS* pExp)
{
throw SE_Exception(u, pExp);
}
#else
struct SE_Exception
{
unsigned int get_error_code() const { return 0; }
std::string get_error_str() const { return std::string("Not MSVC compiler"); }
};
#endif
int main() {
#ifdef _MSC_VER
_set_se_translator( trans_func );
#endif
try {
int a = 0;
int b = 1 / a;
std::cout << "b: " << b << std::endl;
} catch(SE_Exception &e) {
std::cout << "SEH exception: (" << e.get_error_code() << ") " << e.get_error_str() << std::endl;
} catch(...) {
std::cout << "Unknown exception." << std::endl;
}
int b;
std::cin >> b;
return 0;
}
最佳答案
除以零和许多其他特定的、与硬件相关的运行时错误(例如无效指针取消引用)是未定义的行为,这意味着实现可以自由地以任何它想要的方式处理它。
专门针对被零除、溢出和其他数学错误,请参阅(强调我的):
5/4 [expr]
If during the evaluation of an expression, the result is not mathematically defined or not in the range of representable values for its type, the behavior is undefined. [ Note: most existing implementations of C ++ ignore integer overflows. Treatment of division by zero, forming a remainder using a zero divisor, and all floating point exceptions vary among machines, and is usually adjustable by a library function. — end note ]
5.6/4 [expr.mul]
The binary / operator yields the quotient, and the binary % operator yields the remainder from the division of the first expression by the second. If the second operand of / or % is zero the behavior is undefined.
关于空指针解引用,参见:
8.3.2/5 [dcl.ref]
in particular, a null reference cannot exist in a well-defined program, because the only way to create such a reference would be to bind it to the “object” obtained by dereferencing a null pointer, which causes undefined behavior.
其他具体错误散布在整个标准中,我不会全部引用它们,但你明白了。
既然是UB,没有通用的解决方案来处理。通常,MS Windows 会通过 SEH 传播错误,类 Unix 平台会使用信号,而其他操作系统甚至可能会做其他事情。正如上面引述的那样,甚至可以通过依赖于实现的库调用来调整行为。
唯一真正的解决方案是首先通过在代码中插入相关检查来防止这些错误的发生。
关于c++ - 在不同的 C++ 编译器中有通用的解决方案来捕获异常类型被零除,段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17106448/
我正在尝试编写一个相当多态的库。我遇到了一种更容易表现出来却很难说出来的情况。它看起来有点像这样: {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE
谁能解释一下这个表达式是如何工作的? type = type || 'any'; 这是否意味着如果类型未定义则使用“任意”? 最佳答案 如果 type 为“falsy”(即 false,或 undef
我有一个界面,在IAnimal.fs中, namespace Kingdom type IAnimal = abstract member Eat : Food -> unit 以及另一个成功
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: What is the difference between (type)value and type(va
在 C# 中,default(Nullable) 之间有区别吗? (或 default(long?) )和 default(long) ? Long只是一个例子,它可以是任何其他struct类型。 最
假设我有一个案例类: case class Foo(num: Int, str: String, bool: Boolean) 现在我还有一个简单的包装器: sealed trait Wrapper[
这个问题在这里已经有了答案: Create C# delegate type with ref parameter at runtime (1 个回答) 关闭 2 年前。 为了即时创建委托(dele
我正在尝试获取图像的 dct。一开始我遇到了错误 The function/feature is not implemented (Odd-size DCT's are not implemented
我正在尝试使用 AFNetworking 的 AFPropertyListRequestOperation,但是当我尝试下载它时,出现错误 预期的内容类型{( “应用程序/x-plist” )}, 得
我在下面收到错误。我知道这段代码的意思,但我不知道界面应该是什么样子: Element implicitly has an 'any' type because index expression is
我尝试将 SignalType 从 ReactiveCocoa 扩展为自定义 ErrorType,代码如下所示 enum MyError: ErrorType { // .. cases }
我无法在任何其他问题中找到答案。假设我有一个抽象父类(super class) Abstract0,它有两个子类 Concrete1 和 Concrete1。我希望能够在 Abstract0 中定义类
我想知道为什么这个索引没有用在 RANGE 类型中,而是用在 INDEX 中: 索引: CREATE INDEX myindex ON orders(order_date); 查询: EXPLAIN
我正在使用 RxJava,现在我尝试通过提供 lambda 来订阅可观察对象: observableProvider.stringForKey(CURRENT_DELETED_ID) .sub
我已经尝试了几乎所有解决问题的方法,其中包括。为 提供类型使用app.use(express.static('public'))还有更多,但我似乎无法为此找到解决方案。 index.js : imp
以下哪个 CSS 选择器更快? input[type="submit"] { /* styles */ } 或 [type="submit"] { /* styles */ } 只是好
我不知道这个设置有什么问题,我在 IDEA 中获得了所有注释(@Controller、@Repository、@Service),它在行号左侧显示 bean,然后转到该 bean。 这是错误: 14-
我听从了建议 registering java function as a callback in C function并且可以使用“简单”类型(例如整数和字符串)进行回调,例如: jstring j
有一些 java 类,加载到 Oracle 数据库(版本 11g)和 pl/sql 函数包装器: create or replace function getDataFromJava( in_uLis
我已经从 David Walsh 的 css 动画回调中获取代码并将其修改为 TypeScript。但是,我收到一个错误,我不知道为什么: interface IBrowserPrefix { [
我是一名优秀的程序员,十分优秀!