目录
一、Python定义变量
错误示范
int a ="Panana"
print("Hi!"+a)
python中声明变量不用指明类型,就是因为类型不是存储在变量当中,而是存储在对象当中,变量就类似于C中的一个空指针,只能指明对象的所在位置,在python中执行表达式的时候立即用对象来替换掉变量。
正确示范
a="panana"
print("Hi!"+a)
二、Python异常处理
1. Python与Java对比
- python 中使用四个关键字来处理异常:try、except、finally、raise
try:捕获异常,类似于 java 中的 try
except:处理异常,类似于 java 中的 catch
finally:不管是否捕获到异常都会被执行,类似于 java 中 的 finally
raise:抛出异常,类似于 java 中的 throw
#举例
try:
num1 = int(input("请输入第一个数:"))
num2 = int(input("请输入第二个数:"))
result = num1 / num2
print("{0} / {1} = num{2}".format(num1, num2, result))
except IndexError:
print('error...')
except ValueError as e:
print("ValueError:{0}".format(e))
finally:
print("bye bye")
#raise抛出异常
inputValue=input("请输入一个数字:")
type(inputValue)
if inputValue.isdigit():
print(inputValue)
else:
raise ValueError
- java 中 处理异常有五个关键字:try catch finally throw throws
try:将可能发生的异常存放到try块中
catch:对异常进行捕获
finally:无论是否出现异常都执行
throw:在方法体中抛出异常
throws:在方法上抛出异常
java 中 所有异常的父类为Throwable,Throwable 中有两个重要的子类:Error(错误)和 Exception(异常)
Error 是不可恢复的异常,比如:JVM 溢出。
Exception 又分为两种异常:检查时异常和运行时异常。
// 检查时异常
//检查时异常的特点是需要客户程序员捕获异常(try)或抛出异常(throws)让调用着来
//处理,比如在IO编程、线程、xml解析应用中的异常都为检查时异常,需要我们手动捕获或抛出异常。
public static void main(String[] args){
try {
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
}
// 运行时异常
//运行时异常指的是所有的RuntimeException及其子类,特点是无须客户程序员try或throws
public static void main(String[] args){
args[1] = "exception"; // 数组下标访问越界
}
参考:
2. C++与Java对比
C++ | Java |
所有类型都可以作为异常抛出 | 只有可抛出的对象可以作为异常抛出 |
有一种特殊的捕获方法称为“catch all”,它可以捕获所有类型的异常。 | 我们可以捕获Exception对象来捕获各种异常。因为通常我们不会捕获Throwable(s),除了Exception(s) |
在c++中没有这样的块 | 一个名为finally的特殊块总是在try-catch块之后执 |
所有异常都未检查 | 有两种类型的异常—已检查的和未检查的 |
关键字throw用于列出函数可能抛出的异常 | 特殊的关键字throws用于列出函数可能抛出的异常 |
在c++中查找和处理异常是相当困难的 | 在Java中查找和处理异常更容易 |
//数组越界 ArrayIndexOutOfBoundsException
int b[] = new int [5];
Scanner s = new Scanner(System.in);
try {
for(int i = 0; s.hasNextInt(); ++i)
b[i] = s.nextInt(); } catch(ArrayIndexOutOfBoundsException e) {
System.out.print("数组越界! ");
System.out.println("下标: " + e.getMessage());
}
for(int i = 0; i < b.length; ++i)
System.out.print(b[i] + " ");
3. 更多对比
C、C++、Java 、Python 、Go 、Rust 、Dart 异常处理
4. catch与except的区别
//try ... catch 这个是C++语言定义的, 每个C++都有对其的不同的实现. 使用也很简单.
//比如我们有一个函数, 读入年龄. 如果<=0 或者 >=100, 抛出异常:
int readAge() {
int age = 读入年龄;
if (age <=0 || age >= 100) {
throw AgeException(age);
}
return age;
}
//自定义异常类
class AgeException {
public:
int errorAge;
AgeException(int age) {
errorAge = age;
}
};
//简化后
try {
int i = readAge();
printf("Age inputed is %d", i);
} catch (AgeException e) {
printf("error. Age inputed = %d and is not valid.", e.errorAge);
}
try...catch是编译器对__try ... __except的一个包装; 该包装仅处理C++异常类型, 但是提供了比较方便的方法来传递抛出的异常信息, 这样程序员能够比较方便的处理异常, 而不用想上面的例子那样要手工去异常信息中去取.
参考:try_catch和__try_except区别 - 泰坦妮克号 - 博客园 (cnblogs.com)
5.except与throw的区别
catch是方法内抓取异常,然后处理;处理的方法包含往上抛,或者说往外抛(打印输出异常信息);
throw是抛出异常,往上层抛。上层是调用self的这个方法
- 若一段代码前有异常抛出,并且这个异常没有被捕获,这段代码将产生编译时错误「无法访问的语句」(throw后不继续执行代码)
- 若一段代码前有异常抛出,并且这个异常被try...catch所捕获,若此时catch语句中没有抛出新的异常,则这段代码能够被执行(throw后继续执行代码)
注:
- catch异常有顺序的要求,异常应该从小到大顺序写;否则会报错;
- throw 后面抛的异常没有顺序的要求;如果有匹配的小范围的具体异常,会自动抛出throw里的具体的异常,如果throw没有具体的小范围的异常,则会抛出Exception(如果有的话);
6. 总结
实习生遇到问题要及时抛出来,就像try catch finally与try except,有效防止程序发生bug就阻塞进程结束运行。将问题抛出后更加便于程序流畅执行,不影响后续的任务进度。正如健壮的程序不能没有异常处理,良好的工作习惯也不能没有trycatch,及时抛出及时反馈问题,让问题得到最快答复最优解,积极提高工作效率。finally就像每天必定执行的程序,例如写日报发邮件发工具提醒;except就像自己能够捕获到bug定位问题,识别异常类型,这也抛出后不仅有利于得到快速的反馈,还能够便于自己解决问题,找到解题思路。
当然最重要的不是抛出问题,解决问题才是关键。try只是第一步,如何真正的完成任务还需要更多的付出。
再例如我看到一篇好的文章,先把他throw出来,方便以后进行知识整理以及二次阅读。生活中许多地方都能体现try except的思想,所以编程习惯不仅仅只影响了代码规范,还会影响各位程序员的思考方式,让我们的人生充满哲学。