python異常處理,日志處理


整體的流程
  try:
    '需要測試代碼塊'
except + 異常的類型,如果實在知道會出現什么樣的類型,可以直接使用Exception ,它是所有異常類型的根
# 在這也可以使用except + 異常類型 + as  變量 : 這可以將捕獲到的異常類型賦值該變量

else:
    '當try的使用的代碼沒有出現異常的時候,就執行這里的命令'
finally:
    '無論try下面有沒有拋出異常,這里的命令都會執行'

 

也可以將多個異常的類型在同一個except 下面執行

try:

       input(“please input the frist number:”)

       input(“please input the second number:”)

except(TypeError,NameError): #多個異常,無論匹配到哪個都可以執行下面的命令

       print(“what you intput is  wrong”)

 

如果想知道發生的是什么異常,可以這樣子操作

 except(TypeEorror,NameError) as pan:

      print(pan)

這樣的話,在出現錯誤的時候會打印相應的錯誤,之后再正常運行其他的命令

 

當用戶沒有按照程序的提示直接亂輸入東西的時候, 我們可以通過拋出異常,去通知用戶

引發異常

raise  語句 引發異常用的數據,一般是用於測試

raise Exception:   只是顯示默認的異常,是所有異常的根

raise Exception(‘I love my mother’)  如果出現這類的異常的話,會直接顯示自己定義的信息

注意的是當程序運行到raise的時候就會中斷程序,並將異常返回給調用方,如果調用方沒有處理的話,最終會拋給用戶

 

自定義異常(只是創建一個類,並繼承Exception)

class GenderException(Exception):
    pass

class Person:
    def __init__(self,name,gender):
        self.name = name
        self.gender = gender
    def Go_to(self):
        if self.gender != '':
            try:
                raise GenderException('你確定你是男的')
            except GenderException:
                print('我的天')
        else:
            print('你好啊,你來了')

p1 = Person('cc','')
p1.Go_to()


在調試的時候常用的模塊是traceback,用來追蹤異常返回信息
import traceback
try:
    raise SyntaxError("traceback test")
except:
    traceback.print_exc()#這只是打印異常的返回信息,可以在括號內設置保存
    traceback.format_exc()#這個是獲取異常的返回信息,但是沒有打印

 

注意的是如果在except 下使用raise 后面沒有帶任何的錯誤的類型的話,那么其引發的異常是重新引發該子句捕獲到的異常

 

例如異常程序在讀取代碼的時候, 用戶使用CTRL +C 中斷了程序,這是就會相應的動作表示程序中斷

 

 

出現這種情況的時候,如果想要程序還是能夠正常執行,這時就可以使用finally 執行剩余的命令,例如上面打開了一個文件,這是就可以通過使用finally 將這個文件關閉

 

自定義的異常,在正常的情況下,自己虛擬出來的一個異常

 

日志處理

# import logging
# # filename: 文件名
# # format: 數據的格式化輸出. 最終在日志文件中的樣子
# # 時間-名稱-級別-模塊: 錯誤信息
# # datefmt: 時間的格式
# # level: 錯誤的級別權重, 當錯誤的級別權重⼤於等於leval的時候才會寫⼊⽂件
# 當前配置表示 0以上的分數會被寫文件
# CRITICAL = 50
# FATAL = CRITICAL
# ERROR = 40
# WARNING = 30
# WARN = WARNING
# INFO = 20
# DEBUG = 10
# NOTSET = 0
import logging
logging.critical("我是critical") # 50分. 最高的 logging.error("我是error") # 40分 logging.warning("我是warning") logging.info("我是info") logging.debug("我是debug") logging.log(1, "我什么都不是")
上面只是簡單將內容輸出到屏幕,一般都是將日志輸出到文本中的如下:

方案1 :只是使用logging模塊中的basicConfig (輸出位置,日志格式,日志等級)
import logging logging.basicConfig(filename='x1.log', format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S',file =
   level
=30) #在這里設置記錄的是什么等級以上的日志 logging.critical("我是critical") # 50分. 最高的 logging.error("我是error") # 40分 logging.warning("我是warning") logging.info("我是info") logging.debug("我是debug") logging.log(1, "我什么都不是") import traceback try: print(1/0) except Exception: logging.error(traceback.format_exc()) # 用法 print("出錯了") #方案二:可以將日志寫入到多個文件中 import logging # 創建一個操作日志的對象logger(依賴FileHandler) # file_handler = logging.FileHandler('自定義操作日志文本1.log', 'a', encoding='utf-8') file_handler.setFormatter(logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s")) logger1 = logging.Logger('qq', level=20) #這里是設置記錄日志的name 和level等級,只有高於這個等級的才會寫入到日志里面 logger1.addHandler(file_handler) # 把文件助手和日志對象綁定 logger1.error('我是A系統出錯了') # 記錄日志 # 再創建一個操作日志的對象logger(依賴FileHandler) file_handler2 = logging.FileHandler('自定義操作日志文本2.log', 'a', encoding='utf-8') file_handler2.setFormatter(logging.Formatter(fmt="%(asctime)s - %(name)s -%(levelname)s -%(module)s: %(message)s")) logger2 = logging.Logger('B系統', level=20) logger2.addHandler(file_handler2) import traceback try: print(1/0) except Exception: logger2.critical(traceback.format_exc()) print("出錯了. 請聯系管理員") print("程序繼續知悉個")

 format參數中可能用到的格式化串:
%(name)s Logger的名字
%(levelno)s 數字形式的日志級別
%(levelname)s 文本形式的日志級別
%(pathname)s 調用日志輸出函數的模塊的完整路徑名,可能沒有
%(filename)s 調用日志輸出函數的模塊的文件名
%(module)s 調用日志輸出函數的模塊名
%(funcName)s 調用日志輸出函數的函數名
%(lineno)d 調用日志輸出函數的語句所在的代碼行
%(created)f 當前時間,用UNIX標准的表示時間的浮 點數表示
%(relativeCreated)d 輸出日志信息時的,自Logger創建以 來的毫秒數
%(asctime)s 字符串形式的當前時間。默認格式是 “2003-07-08 16:49:45,896”。逗號后面的是毫秒
%(thread)d 線程ID。可能沒有
%(threadName)s 線程名。可能沒有
%(process)d 進程ID。可能沒有
%(message)s用戶輸出的消息


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM