Python基础教程 第8章: 异常 学习笔记

文章部分内容参考至: http://www.runoob.com/python/python-exceptions.html

主动抛异常:

class MyException(Exception):
    pass

#相当于c++中的throw, 主动抛异常
raise MyException

>>>

Traceback (most recent call last):
File "hello.py", line 4, in <module>
raise MyException
MyException

使用dir列出模块中的所有函数:

import exceptions
print dir(exceptions)

列出了所有异常类:

>>>
[‘ArithmeticError‘, ‘AssertionError‘, ‘AttributeError‘, ‘BaseException‘, ‘BufferError‘, ‘BytesWarning‘, ‘DeprecationWarning‘, ‘EOFError‘, ‘EnvironmentError‘, ‘Exception‘, ‘FloatingPointError‘, ‘FutureWarning‘, ‘GeneratorExit‘, ‘IOError‘, ‘ImportError‘, ‘ImportWarning‘, ‘IndentationError‘, ‘IndexError‘, ‘KeyError‘, ‘KeyboardInterrupt‘, ‘LookupError‘, ‘MemoryError‘, ‘NameError‘, ‘NotImplementedError‘, ‘OSError‘, ‘OverflowError‘, ‘PendingDeprecationWarning‘, ‘ReferenceError‘, ‘RuntimeError‘, ‘RuntimeWarning‘, ‘StandardError‘, ‘StopIteration‘, ‘SyntaxError‘, ‘SyntaxWarning‘, ‘SystemError‘, ‘SystemExit‘, ‘TabError‘, ‘TypeError‘, ‘UnboundLocalError‘, ‘UnicodeDecodeError‘, ‘UnicodeEncodeError‘, ‘UnicodeError‘, ‘UnicodeTranslateError‘, ‘UnicodeWarning‘, ‘UserWarning‘, ‘ValueError‘, ‘Warning‘, ‘WindowsError‘, ‘ZeroDivisionError‘, ‘__doc__‘, ‘__name__‘, ‘__package__‘]

自定义异常类,只需要继承自Exception类即可。

捕获异常:

try:
    n = input("input number: ")
    print 3 / n
except ZeroDivisionError:
    print "Div Zero Error"

>>>
input number: 1
3
>>>
input number: 0
Div Zero Error

异常继续向上层抛:

def fun(n):
    try:
        print 3 / n
    except ZeroDivisionError:
        print "fun::Error"
        #继续向上抛该异常
        raise

def Myfun():
    try:
        n = input("input number: ")
        fun(n)
    except ZeroDivisionError:
        print "Myfun::Error"

Myfun()

>>>
input number: 0
fun::Error
Myfun::Error

多个except子句和一个try块捕获多个异常:

def Myfun():
    try:
        x = input("input x number: ")
        y = input("input y number: ")
        print x / y
        print "Hello"
    #多个except块
    except ZeroDivisionError:
        print "ZeroDivisionError"
    except TypeError:
        print "TypeError"

def fun():
    try:
        x = input("input x number: ")
        y = input("input y number: ")
        print x / y
        print "Hello"
    #同时捕获两个异常
    except (ZeroDivisionError, TypeError):
        print "ZeroDivisionError or TypeError"

fun()

input x number: 3
input y number: 1
3
Hello
>>>
input x number: 3
input y number: 0
ZeroDivisionError or TypeError
>>>
input x number: 3
input y number: "a"
ZeroDivisionError or TypeError

捕获异常对象:如果程序中有记录错误日志的功能,获取到异常对象后,然后调用该对象的记录日志的方法即可

def fun():
    try:
        x = input("input x number: ")
        y = input("input y number: ")
        print x / y
        print "Hello"
    #同时捕获两个异常
    except (ZeroDivisionError, TypeError), e:
        print "ZeroDivisionError or TypeError"
        print e

fun()

>>>
input x number: 3
input y number: 0
ZeroDivisionError or TypeError
integer division or modulo by zero

异常全捕获:

try:
    x = input("x: ")
    y = input("y: ")
    print x / y

except ZeroDivisionError:
    print "ZeroDivisionError"
except TypeError:
    print "TypeError"
except Exception, e:   #except:
    print "Other Error"
    print e
while True:
    try:
        x = input("intput x: ")
        y = input("intput y: ")
        print x / y
    #死循环接收用户输入并输出结果
    except Exception:
        print "Exception"
    #如果异常则继续循环, 否则就退出循环
    else:
        break

finally: 不管是否发生有异常,都一定会被执行到的语句

#跟java一样, Python中也有finally关键字

try:
    x = input("x: ")
    print 3 / x
except Exception:
    print "Exception"
finally:
    print "我被执行了"

>>>
x: 1
3
我被执行了
>>>
x: 0
Exception
我被执行了

一个异常可以带上参数,可作为输出的异常信息参数,可以通过except语句来捕获异常的参数:

try:
   You do your operations here;
   ......................
except ExceptionType, Argument:
   You can print value of Argument here...

变量接收的异常值通常包含在异常的语句中。在元组的表单中变量可以接收一个或者多个值。元组通常包含错误字符串,错误数字,错误位置。

# Define a function here.
def temp_convert(var):
   try:
      return int(var)
   except ValueError, Argument:
      print "The argument does not contain numbers\n", Argument

# Call above function here.
temp_convert("xyz");

>>>
The argument does not contain numbers
invalid literal for int() with base 10: ‘xyz‘

try的工作原理是,当开始一个try语句后,python就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try子句先执行,接下来会发生什么依赖于执行时是否出现异常。

如果当try后的语句执行时发生异常,python就跳回到try并执行第一个匹配该异常的except子句,异常处理完毕,控制流就通过整个try语句(除非在处理异常时又引发新的异常)。

如果在try后的语句里发生了异常,却没有匹配的except子句,异常将被递交到上层的try,或者到程序的最上层(这样将结束程序,并打印缺省的出错信息)。

如果在try子句执行时没有发生异常,python将执行else语句后的语句(如果有else的话),然后控制流通过整个try语句。

有些时候,条件语句可以实现和异常同样的功能,但是条件语句可能在自然性和可读性上差些,而从另一方面来看,某些程序中使用if/else实现会比使用try/except要好。

时间: 2024-10-18 20:57:37

Python基础教程 第8章: 异常 学习笔记的相关文章

Python基础教程(第九章 魔法方法、属性和迭代器)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5437223.html______ Created on Marlowes 在Python中,有的名称会在前面和后面都加上两个下划线,这种写法很特别.前面几章中已经出现过一些这样的名称(如__future__),这种拼写表示名字有特殊含义,所以绝不要在自己的程序中使用这样的名字.在Python中,由这些名字组成的集合所包含的方法称

Python基础教程(第八章 异常)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5428641.html______ Created on Marlowes 在编写程序的时候,程序员通常需要辨别事件的正常过程和异常(非正常)的情况.这类异常事件可能是错误(比如试图除以0),或者是不希望经常发生的事情.为了能够处理这些异常事件,可以在所有可能发生这类事件的地方都使用条件语句(比如让程序检查除法的分母是否为零).但

Python基础教程(第二章 列表和元组)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5293195.html______ Created on Xu Hoo 本章将引入一个新的概念:数据结构.数据结构是通过某种方式(例如对元素进行编号)组织在一起的数据元素的集合,这些数据元素可以是数字或者字符,甚至可以是其他数据结构.在Python中,最基本的数据结构是序列(sequence),序列中的每个元素被分配一个序号——即

python基础教程:第一章

引言 Python是一门计算机能够理解的语言.功能强大,容易入门.是初学者学习编程语言不错的选择.本篇属于python基础知识.简单介绍了变量.函数.模块和字符串的知识. 内容 主要介绍变量.语句.函数.获取用户输入.模块.字符串等知识. 推荐书籍 <python基础教程> <python核心编程>

Python基础教程 第11章: 文件和流 学习笔记

本文部分内容转载于: http://www.runoob.com/python/python-files-io.html http://docs.pythontab.com/python/python2.7/inputoutput.html#tut-files 打开文件: 你必须先用Python内置的open()函数打开一个文件,创建一个file对象,相关的辅助方法才可以调用它进行读写.语法: file object = open(file_name [, access_mode][, buff

Python基础教程 第2章: 列表和元组 学习笔记

序列是一种数据结构, 它包含的元素都进行了编号(从0开始).典型的序列包括列表.字符串和元组.其中,列表是可变的,而元组和字符串是不可变的. 个人感觉列表跟C语言中的数组很相似,但也有不用之处,比如在数组中元素的类型都是一样的,而在列表中元素的类型可以混合. 索引(下标): 与C语言中的数组一样,列表支持下标访问,通过下标来访问列表中的元素. #序列赋值 x = [1, 2, 3, "hello", 'abc'] print x #下标访问 print x[0] print x[3]

Python基础教程 第六章 学习笔记

收集函数 把实际参收集到元组和字典当中 1 def print_params(*params): 2 print(params) 3 """ 4 print_parasm(1,2,3) 5 output: (1,2,3) 6 """ 7 8 def print_params_2(**params): 9 print(params) 10 11 """ 12 print_params_2(x=1, y=2, z=3)

【读书笔记】《Python基础教程》第一章 基础知识

第一章 基础知识 实现两个数整除:使用命令开关 -Qnew (?): 使用双斜线. from future import division 执行向计算器那样的普通除法. 幂(乘方)运算符: 2 ** 3 (8),用函数代替 pow(2,3),内建函数 长整数型:在数字结尾加L.eg:10000000000000L 获取用户输入 input("提示信息 :") eg: x = input("x: ") .输入的是合法的python表达式 raw_input("

python基础教程第5章——条件循环和其他语句

1.语句块是在条件为真(条件语句)时执行或者执行多次(循环语句)的一组语句.在代码前放置空格来缩进语句即可穿件语句块.块中的每行都应该缩进同样的量.在Phyton中冒号(:)用来标识语句块的开始,块中的每个语句都是缩进的(缩进量相同).当会退到和已经闭合的快一样的缩进量时,就表示当前块已经结束了. 2.布尔值:False None 0 "" () [] {}也就是说标准值False和None.所有类型的数字0(包括浮点型 长整型 和其他类型)空序列(比如空字符串.元组.列表)以及的空字