国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

簡單介紹Python中的try和finally和with方法

2020-02-23 01:05:16
字體:
來源:轉載
供稿:網友

用 Python 做一件很平常的事情: 打開文件, 逐行讀入, 最后關掉文件; 進一步的需求是, 這也許是程序中一個可選的功能, 如果有任何問題, 比如文件無法打開, 或是讀取出錯, 那么在函數內需要捕獲所有異常, 輸出一行警告并退出. 代碼可能一開始看起來是這樣的
 

def read_file():   try:     f = open('yui', 'r')     print ''.join(f.readlines())   except:     print 'error occurs while reading file'  finally:     f.close()

    不過這顯然無法運作, 因為  f  是在  try  塊中定義的, 而在  finally  中無法引用.

    如果將  f  提取到  try  塊外部, 如
 

def read_file():    f = open('azusa', 'r')   try:     print ''.join(f.readlines())   except:     print 'error occurs while reading file'  finally:     f.close()

那么, 問題在于當打開文件失敗, 拋出異常將不會被捕獲.

    挫一點的方法自然是, 再套一層  try  吧
 

def read_file():    try:     f = open('sawako', 'r')     try:       print ''.join(f.readlines())     except:       print 'error occurs while reading file'    finally:       f.close()    except:      print 'error occurs while reading file'

    當然這不僅僅是多一層縮進挫了, 連警告輸出都白白多一次呢.

    正規一點的方式是, 使用 Python 引入的  with  結構來解決, 如
 

def readFile():   try:      with open('mio', 'r') as f:       print ''.join(f.readlines())   except:     print 'error occurs while reading file'

    當文件打開失敗時, 異常自然會被  except  到; 否則, 在  with  塊結束之后, 打開的文件將自動關閉.

    除了打開文件, 還有其它這樣可以用于  with  的東西么? 或者說, 怎么自定義一個什么東西, 讓它能用于  with 呢?
    直接回答后一個問題吧, 秘密在于 Python 虛擬機在  with  塊退出時會去尋找對象的  __exit__  方法并調用它, 把釋放資源的動作放在這個  __exit__  函數中就可以了; 另外, 對象還需要一個  __enter__  函數, 當進入  with 塊時, 這個函數被調用, 而它的返回值將作為  as  后引用的值. 一個簡單的例子是
 

class Test:   def __init__(self):     print 'init'   def __enter__(self):     print 'enter'    return self   def __exit__(self, except_type, except_obj, tb):     print except_type     print except_obj     import traceback     print ''.join(traceback.format_tb(tb))     print 'exit'    return True with Test() as t:   raise ValueError('kon!')            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 澄迈县| 乐平市| 惠安县| 海城市| 寿阳县| 石家庄市| 商洛市| 武穴市| 三穗县| 辰溪县| 连州市| 田林县| 辽阳县| 石渠县| 崇仁县| 乌鲁木齐市| 吉首市| 吉木萨尔县| 汝城县| 新沂市| 弥渡县| 新宾| 颍上县| 天长市| 鹰潭市| 鸡泽县| 延长县| 泾川县| 福贡县| 兰溪市| 盘山县| 永仁县| 青冈县| 湾仔区| 枣庄市| 阿瓦提县| 阜新市| 双辽市| 南安市| 鄂托克前旗| 松潘县|