Java中有强制类型异常,但是C++中没有,其实强制类型异常任何语言都可以实现。例如在json11库中,解析json时,需要传递string& err作为参数,强制要求获取错误结果。在编程的时候,也是告诉程序员这个地方可能会出现异常,请一定要重视。程序员可以将当前的异常传递给调用的函数,继续执行,或直接返回。在Golang中,err作为很多函数的返回值,要求必须接收。这在一定程度上都模仿的java的强制异常,所以C++中也可以采用同样的方式,处理程序错误。
void func(int c, string& err)
{
if(c==0)
{
err = "Error Info...";
return;
}
//... Do Something
return;
}
//Call
string err;
func(0, err);
if(!err.empty())
{
printf(err);
}
个人感觉将string& err作为一个函数的参数,虽然在调用的时候回麻烦点,但是却可以从参数前面中明确看到该函数可能会执行失败,其次,这种方式相对固定,容易理解。而C语言习惯将错误结果作为返回值,使用不同的整形表示错误,这种实质上将错误认定为默认不处理对新手程序员并不很好,很容易漏掉重要的错误。其次,不同的错误结果代表了不同的错误类型,包含信息有限,出现错误时还需查询函数,而不能从日志中直接获取错误原因,可扩展性差。
对于C++11,异步编程变的更加普遍,将带有string&err的参数仍然可以放置在异步回调函数中,有种nodejs中诸多异步程序一样的编程体验。
func(function<void(string& err)> callback)
{
thread t([&](){
err = "Some Error";
callback(err)
});
t.detach();
}
//Call
func([&](string& err){
if(!err.empty()){
printf(err);
}
});