Python定义变量与异常处理

目录

一、Python定义变量

二、Python异常处理

 1. Python与Java对比

2. C++与Java对比

3. 更多对比

4. catch与except的区别


一、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"; // 数组下标访问越界
}

 参考:

http://t.csdnimg.cn/Tmp75

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后继续执行代码)

注:

  1. catch异常有顺序的要求,异常应该从小到大顺序写;否则会报错;
  2. throw 后面抛的异常没有顺序的要求;如果有匹配的小范围的具体异常,会自动抛出throw里的具体的异常,如果throw没有具体的小范围的异常,则会抛出Exception(如果有的话);

6. 总结

        实习生遇到问题要及时抛出来,就像try catch finally与try except,有效防止程序发生bug就阻塞进程结束运行。将问题抛出后更加便于程序流畅执行,不影响后续的任务进度。正如健壮的程序不能没有异常处理,良好的工作习惯也不能没有trycatch,及时抛出及时反馈问题,让问题得到最快答复最优解,积极提高工作效率。finally就像每天必定执行的程序,例如写日报发邮件发工具提醒;except就像自己能够捕获到bug定位问题,识别异常类型,这也抛出后不仅有利于得到快速的反馈,还能够便于自己解决问题,找到解题思路。

        当然最重要的不是抛出问题,解决问题才是关键。try只是第一步,如何真正的完成任务还需要更多的付出。

        再例如我看到一篇好的文章,先把他throw出来,方便以后进行知识整理以及二次阅读。生活中许多地方都能体现try except的思想,所以编程习惯不仅仅只影响了代码规范,还会影响各位程序员的思考方式,让我们的人生充满哲学。

  • 30
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值