我知道这可能并不重要,但我想知道什么是正确的.
如果一段代码包含某些版本的throw new SomeKindOfException()
.我们是否说这段代码可能引发异常?或抛出异常?
关键字是throw
,所以我倾向于那个,但提出异常也被大量使用...
他们有某种不同的含义吗?他们中的一个是否与另一个有所不同?或者它只是两个词意味着完全相同的东西?
我有一个Scala帮助器方法,当前尝试获取URL并返回带有该网页的HTML的Option [String].
如果有任何异常(格式错误的URL,读取超时等等)或者如果有任何问题,则返回None.问题是,抛出异常以便调用代码可以记录异常或者在这种情况下返回None是否更好?
我想重载throw关键字以捕获一个继承自Exception的类,并让它在实际抛出之前执行一些日志记录和其他操作.这可能吗?或者我必须使用常规功能?
我试过了:
public class cSilException : Exception
{
private string m_strMsg;
public override void throw(cSilException ex)
{
}
...
...
}
Run Code Online (Sandbox Code Playgroud) 考虑片段:
try {
Foo f;
throw std::move(f);
}
catch (Foo& f) { }
Run Code Online (Sandbox Code Playgroud)
[expr.throw]说:
异常对象的类型是通过从操作数的静态类型中删除任何顶级cv限定符并将类型从"T的数组"或"返回T的函数"调整为"指向T的指针"或"指针"来确定的.函数返回T",分别.
这将是Foo&&
.然后根据[except.throw]初始化异常对象:
抛出异常copy-initializes(8.5,12.8)一个临时对象,称为异常对象.临时是一个左值,用于初始化匹配处理程序中声明的变量(15.3).如果异常对象的类型是不完整类型或指向不完整类型的指针(可能是cv-qualified),
void
则程序格式不正确.
这告诉我异常对象被初始化为:
Foo&& __exception_object = std::move(f);
Run Code Online (Sandbox Code Playgroud)
并且处理程序不匹配.但是,gcc和clang都会捕获此异常.那么这里的异常对象的实际类型是什么?如果Foo
,为什么?
我想构建一个具有函数的类,这些函数可能会抛出我想要在使用它时捕获的异常.我从标准异常类继承my_exception.我实现了what()函数,以便它返回一个存储在私有字符串变量中的字符串
我认为最好将异常定义为嵌套类,就像在iosream库中使用ios_base :: failure一样.
我不太确定的是,我应该在哪里以及如何定义my_excpetion的对象.我希望我能看到iostream功能的内部代码,看看他们是如何做到的.我考虑了几个选项:
对于异常的每个原因,我可以定义my_exception的静态实例,使用构造函数获取字符串并将其保存到我的私有字符串指针.
对于异常的每个原因,我可以定义另一个继承自my_exception的类,并实现作为返回常量字符串的函数(原因).我可以保存每个异常子类的实例,或抛出类型.顺便说一句,我们什么时候通常抛出类型而不是实例?
我想这是错的:每次我想抛出一个异常,用一个获取字符串的构造函数创建一个新的my_exception.这是用Java完成的,但据我所知,它在C++中会有问题,因为异常应该在某处删除.对?
我认为第一个是正确的,是吗?有更多标准选项吗?
非常感谢你!
这是我想要做的:
var setting = process.env.SETTING || throw new Error("please set the SETTING environmental variable");
^^^^^
Run Code Online (Sandbox Code Playgroud)
但是翻译抱怨"语法错误:意外的令牌抛出".
有没有办法在同一行中抛出异常,我们比较一个值是否为假?
我正在编写一组扩展的自定义异常std::exception
.在某些代码中,当捕获异常时,我只是重新throw
启动链,直到驱动程序main
函数调用catch
es并打印结果.但是,最终打印的所有内容都是"std :: exception".这似乎不是我之前处理的范围问题.
为什么我的异常消息不能打印?
我的异常代码:
// General exception class
struct MyException : public std::exception
{
std::string _msg;
MyException(const std::string &exception_name) : _msg(exception_name) {}
void setMessage(const std::string &message)
{
_msg += ": " + message + "\n";
}
void setLocation(const char * func, const char * file, const int line)
{
_msg += " In function " + std::string(func) + "(" + file + ":" + std::to_string(line) + ")";
}
const …
Run Code Online (Sandbox Code Playgroud) 这是在标准C++中实现类似Last的行为的好方法吗?(没有特殊指针)
class Exception : public Exception
{ public: virtual bool isException() { return true; } };
class NoException : public Exception
{ public: bool isException() { return false; } };
Object *myObject = 0;
try
{
// OBJECT CREATION AND PROCESSING
try
{
myObject = new Object();
// Do something with myObject.
}
// EXCEPTION HANDLING
catch (Exception &e)
{
// When there is an excepion, handle or throw,
// else NoException will be thrown.
}
throw NoException();
}
// …
Run Code Online (Sandbox Code Playgroud) 我想知道为什么基类库中的.NET异常类默认有一些可变成员
Source
,HelpLink
和值Data
,但不能改变其他任何像Message
?StackTrace
使它变得可变?将堆栈跟踪信息附加到现有跟踪是更好的设计(但仍然可变)?我只是在设计选择上很有意思......