热度 10
2016-3-18 14:15
1200 次阅读|
0 个评论
单一的分号,表示空指令。请为空指令增加注释,以免别人产生误解。 空括号和空指令的含义是一样的: • {} • ; switch的习惯用法是要加上break。如果确实需要忽略break,就注释一下吧。 总是要为switch增加default,这样告诉别人default的情况是存在的。 switch (flag) { case true: string file_name; //错误,隐式初始化的变量将被跳过 int ival = 0; //错误,显式初始化的变量将被跳过 int ival; //正确,未初始化的变量可以存在 break; case false: jval = next_num(); if (file_name.empty()) //错误,因为它并没有被初始化 break; } 虽然这里有非法的变量,也有合法的变量,所以除非不可避免,否则还是在自己的分支里面定义自己的变量。 注意,程序无法跳过在scope里面的变量初始化操作。 for循环的执行顺序: • 当for循环开始的时候,第一个初始化语句被执行。 • 然后,第二个条件判断开始evaluated。 • 如果为真则执行之后的内容;如果为假则终结循环。 • 如果为真,执行之后的内容之后再执行第三个表达式的内容。 • 重复第二个步骤。 要注意for的初始化语句,只能有一种数据类型。 range for我们已经用过很多次了,它的使用比传统的for更加方便。 不要在range for里面为string、array或者容器添加元素,因为end()是被缓存的,不会随着更改。 ---------------- 以上内容有点无聊,因为C语言里面已经学过了,因此有一种把课本再看一遍的感觉。 但是接下来的内容就不会了,终于有了打起精神的赶脚^_^ try Blocks and Exception Handling 运行中的异常,比如失去了数据库的连接,或者获得了一个unexpected输入,称为exceptions。 处理异常情况,应该是系统设计里面最困难的部分。 Exception handling是指程序的某部分检查到它无法解决的问题,并且用于检查的程序也无法继续。 检查程序需要一种方法,给出错误信号,告诉别人他无法继续了。 另外,检查程序给出的出错信号,并不能知道究竟会是哪个程序来处理它。 还有,检查程序给出信号之后,就停止运行了。 通常情况下,给出exception信号的代码,和处理它的代码,是两个不同的部分。 所以exception handling一般包含两个部分: throw expressions // 产生错误通知的信号 try blocks // 对信号进行处理 假如我们现在需要实现一种功能,连接两个不同的字符串,代码如下: int main() { string str1, str2; cin str1 str2; if (str1 == str2) throw runtime_error("Strings are equal."); cout "String: " str1 + str2 endl; return 0; } 执行的时候,如果我们输入相同的字符串,比如“there”,则会如下执行: $ ./hello there there terminate called after throwing an instance of 'std::runtime_error' what(): Strings are equal. Aborted 执行的时候,如果我们输入不同的字符串,比如“there”、“here”,则会如下执行: $ ./hello there here String: therehere throw的用法是不是很简单呢? 现在我们需要更加复杂一些的处理,而不是使用编译器为我们定义的默认选项,此处就可以使用try了: int main() { string str1, str2; cin str1 str2; try { if (str1 == str2) throw runtime_error("Strings are equal."); cout "String: " str1 + str2 endl; } catch (runtime_error err) { cout "Error: " err.what() endl; } return 0; } 执行的时候,如果我们输入相同的字符串,则它的执行效果和仅仅使用throw是一样的。 执行的时候,如果我们输入不同的字符串,则它的执行效果是: $ ./hello there there Error: Strings are equal. try/catch可以嵌套使用,一个组合里面可以包含另一个组合,就像if/else一样。 搜索handler的顺序是call chain的反向: • 当有异常被抛出,抛出异常的函数会首先被搜索handler。 • 如果没有匹配的handler,这个函数就会被终止。 • 此函数的上一层函数会被搜索,如果没有匹配的handler,则这个函数也会被终止。 • 依此类推。 • 如果所有的函数都搜索不到匹配的handler,则会调用库函数terminate。 要编写安全的异常处理程序,非常的困难,尤其是handler里面对资源的安全回收。 这里就请参考《Unix环境高级编程》了,因为它不仅仅是语言的问题,也是系统的问题。 异常处理的类,包含在四个库文件中: exception: the most general kind of exception class stdexcept: several general-purpose exception classes new: bad_alloc, cover later type_info: bad_cast, cover later 异常类的操作非常少,仅仅有创建、复制和赋值。 异常处理是C++语言里面的一个难点,需要在实际的使用中再多次练习。