C#中的例外有多贵?只要堆叠不深,它们似乎并不是非常昂贵; 但我读过相互矛盾的报道.
有没有被反驳的确定性报告?
我最近接受过采访,面试官希望我做一个技术测试,看看我的知识.在我完成它之后,他给了我关于我是如何做到这一点的反馈,这是我没想到的,我很感激,因为如果他们不想雇用你,很少有采访者这样做.
他告诉我他告诉我他的代码不好的一件事是我在我编写的每个方法中使用了多个try-catch块.这引起了我的注意,因为我觉得它很有趣.
我相信目前我应该创建try-catch块,其中有一个语义可区分的代码块,它有一个或多个方法可以抛出需要捕获的异常.我遵循的唯一例外是,如果两个方法抛出相同的异常类型,我最好将它们放在不同的try-catch块中,以清楚地区分调试抛出异常的位置和原因.
这与采访者希望我做的完全不同.那么每种方法只使用一个try-catch块是一种已知的良好实践吗?如果这是一个众所周知的良好做法,这样做有什么好处?
编辑:我非常感谢您对此的看法,这非常好.虽然请注意我在问这是否是一个已知的良好做法.这是,如果大多数程序员都同意这一点,或者这是一本书中的好习惯
我正在使用promises并且代码如下所示:
function getStuff() {
return fetchStuff().then(stuff =>
process(stuff)
).catch(err => {
console.error(err);
});
}
Run Code Online (Sandbox Code Playgroud)
要么:
async function getStuff() {
try {
const stuff = await fetchStuff();
return process(stuff);
} catch (err) {
console.error(err);
}
}
Run Code Online (Sandbox Code Playgroud)
我这样做是为了避免错过错误但是同事用户告诉我不应该这样做而且不赞成.
return ….catch(err => console.error(err))?如果我自己生成异常,我可以在异常中包含任何信息:源文件的许多代码行和名称.像这样的东西:
throw std::exception("myFile.cpp:255");
Run Code Online (Sandbox Code Playgroud)
但是未处理的异常或不是由我生成的异常是什么?
今天,在我的C++多平台代码中,我对每个函数都进行了尝试.在每个catch块中,我将当前函数的名称添加到异常并再次抛出,以便在最上面的catch块(我最终打印异常的详细信息)中,我有完整的调用堆栈,这有助于我跟踪异常的原因.
这是一个好习惯,还是有更好的方法来获取异常的调用堆栈?
从析构函数抛出异常的主要问题是,在析构函数被调用的那一刻,另一个异常可能是"在飞行中"(std::uncaught_exception() == true),因此在这种情况下做什么并不明显.用新的"覆盖"旧的异常将是处理这种情况的可能方法之一.但是决定在这种情况下必须调用std::terminate(或其他std::terminate_handler).
C++ 11通过std::nested_exception类引入了嵌套异常功能.该特征可用于解决上述问题.旧(未捕获)异常可能只是嵌套到新异常中(反之亦然?)然后可能抛出嵌套异常.但是没有使用这个想法.std::terminate在C++ 11和C++ 14中仍然会出现这种情况.
所以问题.是否考虑过嵌套异常的想法?它有什么问题吗?是不是在C++ 17中会改变这种情况?
它是安全的忽视例外boost::lexical_cast转换时int要std::string?
我必须解析一个可以采用十六进制值或其他非十六进制值的字符串
0xff,0x31或者A,PC,label,等等.
我使用此代码来划分两种情况:
String input = readInput();
try {
int hex = Integer.decode(input);
// use hex ...
} catch (NumberFormatException e) {
// input is not a hex, continue parsing
}
Run Code Online (Sandbox Code Playgroud)
这段代码可以被视为"丑陋"还是难以阅读?还有其他(可能更优雅)的解决方案吗?
编辑:我想澄清(在我的情况下)错误的输入不存在:我只需要区分它是否是十六进制数.而且为了完整起见,我正在为DCPU-16制作一个简单的装配器.
java parsing exception-handling exception numberformatexception
我目前正在为一段代码添加处理,以便它不会崩溃.目前,每个步骤都有一个ASSERT语句,以确保在上一步中没有出错.如果在其中一个步骤中出现问题,则确实出现了问题.该计划应该停止.
虽然在发布模式下程序命中了一个断言,但是快乐地继续前进并崩溃.
为了解决这个问题,我已经将方法包装在try/catch块中,并在以前的断言处抛出错误.这应该记录我们跟踪的所有错误以及其他我们没有记录的错误.
现在我的问题是,我是否还应该使用断言通知程序员这不应该发生?或者现在它们会因为catch块(我清理对象)而不会崩溃?
或者我应该在catch块中而不是每个throw语句中抛出一个断言?
我目前正在开发一个C++项目,其中经常出现动态数组.我想知道,使用new-operator初始化动态数组的正确方法是什么?我的一位同事告诉我,在构造函数中使用new是一个禁忌,因为构造函数是一个不应该容易出错或者根本不应该失败的构造.现在让我们考虑以下示例:我们有两个类,一个或多或少复杂的类State和一个StateContainer类,应该自我解释.
class State {
private:
unsigned smth;
public:
State();
State( unsigned s );
};
class StateContainer {
private:
unsigned long nStates;
State *states;
public:
StateContainer();
StateContainer( unsigned long n );
virtual ~StateContainer();
};
StateContainer::StateContainer() {
nStates = SOME_DEFINE_N_STATES;
states = new State[nStates];
if ( !states ) {
// Error handling
}
}
StateContainer::StateContainer( unsigned long n ) {
nStates = n;
try {
states = new State[nStates]
} catch ( std::bad_alloc &e ) {
// Error handling
}
}
StateContainer::~StateContainer() …Run Code Online (Sandbox Code Playgroud) c++ ×6
exception ×5
try-catch ×3
java ×2
boost ×1
c# ×1
c++11 ×1
callstack ×1
javascript ×1
lexical-cast ×1
new-operator ×1
node.js ×1
parsing ×1
promise ×1