smw*_*dia 4 c# c++ language-agnostic exception-handling exception
我们每天都在讨论异常处理.我们都知道它是在执行遇到某些意外情况时创建的东西.
这里有几个问题:
什么是例外?什么是它最低级别的内存组合?在.NET中,我可以将其视为某种异常类型的对象实例.在本土世界,它是由什么组成的?一些数据是否存在?
如果程序员没有明确抛出异常,谁会创建异常,如下面的代码所示?它是某些语言运行库提供的支持的一部分吗?
SomeException e = new SomeException(); 扔掉;
什么是工作范例的例外?是否真的发生了一些错误,语言运行时会创建相应数据结构/类型的实例以表示错误的详细信息?
我们怎么能在运行时知道所有可能的意外情况,从而创建足够的异常数据结构/类型来表示它们?
谢谢你的回复.
sbi*_*sbi 14
你的问题的答案很大程度上取决于我们所谈论的语言.
尽管有专有语言扩展,但 C根本没有例外.
C++有一种方法可以在代码中的任何位置"抛出"任意对象,并在调用堆栈的某个位置"捕获"它.
C#有一种方法可以"抛出"从中派生的对象System.Exception,也可以"捕获"堆栈中较高层的对象.另外,我认为.NET运行时报告每个抛出异常本身的一些问题.
- 什么是例外?什么是它最低级别的内存组合?在.NET中,我可以将其视为某种异常类型的对象实例.在本土世界,它是由什么组成的?一些数据是否存在?
在C++中,它只是一个任意对象,它像代码中的其他对象一样被创建:
throw 42; // throws an int object
throw "blah"; // throws a char[5] object
throw std::string("arg!"); // throws a std::string object
throw my_type(42); // throws a my_type object
throw std::exception("doh!"); // throws a std::exception object
Run Code Online (Sandbox Code Playgroud)
抛出的异常与catch短语的匹配非常类似于重载函数的匹配.(一个很大的区别是捕获短语是有序的.也就是说,第一个完全匹配将"赢"并捕获对象.但是,重载函数必须始终提供明确的最佳匹配.)
- 如果程序员没有明确抛出异常,谁会创建异常,如下面的代码所示?它是某些语言运行库提供的支持的一部分吗?
在C++中,异常几乎只能从代码中抛出.它可以是您自己的代码,其他人的代码,某些库的代码或标准库的代码.但通常必须在throw某处发表声明.有一些例外(没有双关语意图),就像std::bad_alloc抛出new(可能是从throw代码中的语句抛出,但我认为不必)和std::bad_cast抛出dynamic_cast<>.(此外,下一个标准,C++ 1x,预计明年,允许异常以某种方式跨线程边界,这可能需要标准库实现者找到一种方法来在一个线程中存储异常并从另一个线程重新抛出它.但我'我对此很朦胧.)
Run Code Online (Sandbox Code Playgroud)SomeException e = new SomeException(); throw e;
在C++中你可以,但你很少想要,抛出指针.你要么做
SomeException e; throw e;
Run Code Online (Sandbox Code Playgroud)
要么
throw SomeException();
Run Code Online (Sandbox Code Playgroud)
- 什么是工作范例的例外?是否真的发生了一些错误,语言运行时会创建相应数据结构/类型的实例以表示错误的详细信息?
C++标准库抛出异常的地方很少,但除此之外,我只能想到上面提到的两个特性(加上C++ 1x中的特性),运行时抛出异常"本身".
- 我们怎么能在运行时知道所有可能的意外情况,从而创建足够的异常数据结构/类型来表示它们?
通常只抛出从std::exceptionC++ 派生的类的对象,尽管我遇到过使用它们自己的异常类层次结构的代码,这些代码没有植入std::exception.标准库中的异常层次结构的问题在于它的类非虚拟地相互派生,这使得不可能让自己的异常层次结构使用多重继承来遮蔽标准库中的异常层次结构.(好像是你自己的OutOfRange,从继承异常类型std::out_of_range,并从异常基类MyException,从继承std::exception.)
处理异常的C++方法主要基于以下原则:
| 归档时间: |
|
| 查看次数: |
613 次 |
| 最近记录: |