异常有什么用:
首先请明确,异常的根本作用是跳转,不要看到异常就认为是出错,程序不出错你一样可以throw
异常有什么其他方法替代不了的地方:
跨层传递错误信息并且保证错误信息不丢失。让错误在它应该被捕捉的那一层捕捉。
假设以上三段代码分别是三个不同的人写的。
fun3返回-1表示出错了。
但是如果fun1想知道出错了,需要fun2里面return fun3(),而不能直接调用fun3()就没有了。
直接调用fun3()就导致了错误码的丢失,上层逻辑由于写fun2的人的疏忽,不知道到底是什么错。
但是如果是异常机制,fun3抛出异常,fun2疏忽了,没有try,catch,这个异常不会丢,会继续抛到fun1。
也就是fun2不想关心出了什么错,就可以不关心。
fun1想关心,也不会因为fun2的不关心而导致关心不到,鞭长莫及。
异常怎么用:
尽量不用,就像C里面的goto一样,本质都是跳转。
参考《代码大全》中的一段话:仅在其他编码实践方法无法解决的情况下,才使用异常
一些个人建议,仅供参考
1、在你自己的函数中,检查别人的传入参数是你的责任。
2、调用别人的函数,检查你自己传入的参数的合法性是你的责任,检查它的返回值也是你的责任。
3、别人的代码会抛出异常,不代表你就真的让他抛一个异常出来。我相信它肯定可以不抛出异常的。
4、不要用异常去代替合法性检查,那是推卸责任。
5、程序有bug是正常的,程序出现问题是正常的,依赖于异常来处理问题是不正常的。
6、一个try的代价,不一定比你写一个if的代价小,请参考《More Effective C++》第15条。
7、构造函数出错咋办,如果你处理不好构造,用Init代替构造,用Release代替析构,并确保这两个函数被调用。
8、注意变量初始化了再使用,给定一个安全的默认值,保证即使用户给了一个错误的值,你也可以按默认值跑通你的流程。
首先请明确,异常的根本作用是跳转,不要看到异常就认为是出错,程序不出错你一样可以throw
异常有什么其他方法替代不了的地方:
跨层传递错误信息并且保证错误信息不丢失。让错误在它应该被捕捉的那一层捕捉。
1
2
3
4
5
6
7
8
9
10
11
12
|
int
fun3()
{
return
-1;
}
void
fun2()
{
fun3()
}
void
fun1()
{
fun2()
}
|
假设以上三段代码分别是三个不同的人写的。
fun3返回-1表示出错了。
但是如果fun1想知道出错了,需要fun2里面return fun3(),而不能直接调用fun3()就没有了。
直接调用fun3()就导致了错误码的丢失,上层逻辑由于写fun2的人的疏忽,不知道到底是什么错。
但是如果是异常机制,fun3抛出异常,fun2疏忽了,没有try,catch,这个异常不会丢,会继续抛到fun1。
也就是fun2不想关心出了什么错,就可以不关心。
fun1想关心,也不会因为fun2的不关心而导致关心不到,鞭长莫及。
异常怎么用:
尽量不用,就像C里面的goto一样,本质都是跳转。
参考《代码大全》中的一段话:仅在其他编码实践方法无法解决的情况下,才使用异常
一些个人建议,仅供参考
1、在你自己的函数中,检查别人的传入参数是你的责任。
2、调用别人的函数,检查你自己传入的参数的合法性是你的责任,检查它的返回值也是你的责任。
3、别人的代码会抛出异常,不代表你就真的让他抛一个异常出来。我相信它肯定可以不抛出异常的。
4、不要用异常去代替合法性检查,那是推卸责任。
5、程序有bug是正常的,程序出现问题是正常的,依赖于异常来处理问题是不正常的。
6、一个try的代价,不一定比你写一个if的代价小,请参考《More Effective C++》第15条。
7、构造函数出错咋办,如果你处理不好构造,用Init代替构造,用Release代替析构,并确保这两个函数被调用。
8、注意变量初始化了再使用,给定一个安全的默认值,保证即使用户给了一个错误的值,你也可以按默认值跑通你的流程。