天天看點

Python中異常的處理與sys子產品一.異常二.sys子產品——參數的擷取

一.異常

1、try

(1)接收抛出的異常,使程式在發生異常時仍然可以運作下去,而不是報錯停止

# try:
#     num = int(input('請輸入一個整數:'))		#将不确定是否正常運作的操作放到try中
# except:
#     print('請輸入正确的類型')			#若try中的操作不能正常運作,則運作該操作
# print("*"*20)		#結束後運作該操作,來檢視程式運作是否收到影響
#
# # 請輸入一個整數:2.3	#輸入2.3
# # 請輸入正确的類型		#程式無報錯,但提示有錯誤
# # ********************	#程式在錯誤後還可以繼續運作的表現
           

(2)如何按不同的異常來回報不同的提示

# num = int(input('請輸入一個整數:'))		#若沒有接收抛出的異常直接運作程式
# res=8/num

# 請輸入一個整數:0			#0不能做分母
# Traceback (most recent call last):
#   File "/home/kiosk/PycharmProjects/20191210/note.py", line 23, in <module>
#     res=8/num
# ZeroDivisionError: division by zero		#程式報錯無法繼續運作,且錯誤為“ ZeroDivisionErro”

# 請輸入一個整數:abc		#abc不是整數
# Traceback (most recent call last):
#   File "/home/kiosk/PycharmProjects/20191210/note.py", line 22, in <module>
#     num = int(input('請輸入一個整數:'))
# ValueError: invalid literal for int() with base 10: 'abc'		#程式報錯無法繼續運作,且錯誤為“ValueError”

# try:
#     num = int(input('請輸入一個整數:'))
#     res=8/num
# # except ZeroDivisionError:			#當錯誤為“ZeroDivisionError”時,回報此結果
# #     print("0不能做分母")
# # except ValueError:				#當錯誤為“ValueError”時,回報此結果
# #     print("請輸入正确的資料類型")
#
# # 請輸入一個整數:abc	#測試ValueError的回報
# # 請輸入正确的資料類型		#回報結果正确
#
# # 請輸入一個整數:0	#測試ZeroDivisionError的回報
# # 0不能做分母			#回報結果正确
           

(3)建立所有未知錯誤情況時回報的結果

# except Exception as a:		#當發生沒有記錄在内的錯誤時,進行的操作
#     print("發生未知錯誤",a)		#列印發生未知錯誤,與a的值
#
# #發生未知錯誤 invalid literal for int() with base 10: ''		#a的值為發生該錯誤時系統自動給出的錯誤提示
#
# else:		#否則列印無錯誤
#     print('無錯誤')
#
# # 請輸入一個整數:13	
# # 無錯誤
           

(4)添加一個無論try中的操作是否能正常運作,都會執行的操作

# finally:			#該操作為:無論try中的操作是否正常運作,都會執行
#     print("無論有無錯誤,最後都會執行")
#
# # 請輸入一個整數:1.2		#try中的操作無法正常運作
# # 發生未知錯誤 invalid literal for int() with base 10: '1.2'
# # 無論有無錯誤,最後都會執行
           

2、函數的錯誤

函數有錯誤時一級一級向上去找,最終會将異常傳遞到主函數中

# def hanshu1():
#     try:
#         return int(input('請輸入一個整數:'))
#     except Exception as a:
#         print('發生未知錯誤 %s' %a)
#
# def hanshu2():
#     return hanshu1()
#
# print(hanshu2())
#
# # 請輸入一個整數:abc
# # 發生未知錯誤 invalid literal for int() with base 10: 'abc'
# # None
           

3、主動抛出一個異常

注意:隻抛出而不用try捕獲異常時,代碼會報錯

# def passwd():
#     pwd=input('請輸入您的密碼:')
#     if len(pwd) >= 8:
#         return pwd
#     # 抛出異常
#     print('主動抛出異常')
#     # 建立異常對象
#     ex=Exception('密碼需大于8位')
#     # 主動抛出
#     raise ex
#
# try:
#     print(passwd())
# except Exception as a:
#     print(a)
#
# # 請輸入您的密碼:123456789
# # 123456789
#
# # 請輸入您的密碼:1234
# # 主動抛出異常
# # 密碼需大于8位
           

4、斷言

斷言的作用為可以提前預言,讓人更好的知道錯誤原因,但此方法使用時,程式一旦錯誤,就不能繼續運作,隻适合在編寫時自己查錯使用。
# def fun(num,div):
#     assert (div != 0),'div不能為0'
#     return num/div
# print(fun(10,0))
#
# # Traceback (most recent call last):
# #   File "/home/kiosk/PycharmProjects/20191210/note.py", line 115, in <module>
# #     print(fun(10,0))
# #   File "/home/kiosk/PycharmProjects/20191210/note.py", line 113, in fun
# #     assert (div != 0),'div不能為0'
# # AssertionError: div不能為0
           

二.sys子產品——參數的擷取

# import os
# import sys

# print(sys.argv)
#
# #['/home/kiosk/PycharmProjects/20191210/note.py']   #将目前的位址參數放到一個清單裡
#
# print(sys.argv[0])
#
# #/home/kiosk/PycharmProjects/20191210/note.py   #擷取腳本傳遞的序列号為0的參數
#
# print(sys.version)      #可獲得目前使用的python的版本号
#
# # 3.6.4 (default, Nov 26 2019, 10:03:05)
# # [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]
#
# if sys.version[0] == '2':   #通過檢視序列号為0的參數的值來判斷python的大版本為2還是3
#     print('這是python2')
# elif sys.version[0] == '3':
#     print('這是python3')
#
# #這是python3
           

(1)傳回子產品的搜尋路徑 初始pythonpath環境變量

# print(sys.path)
#
# #'/home/kiosk/PycharmProjects/20191210', '/home/kiosk/PycharmProjects/20191210', ...(以下省略)
           

(2)跨平台的實作

# print(sys.platform)          #檢視目前的平台
# #linux
# if sys.platform == 'linux':  #若目前平台為linux
#     os.system('ifconfig')    #執行指令ifconfig(檢視網卡資訊)
# else:                        #若為其他平台
#     os.system('ipconfig')    #執行指令ipconfig(其他平台中檢視網卡資訊的指令)

# br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500...(以下省略)
#          inet 172.25.254.54  netmask 255.255.255.0  broadcast 172.25.254.255...(以下省略)
#          inet6 fe80::221:ccff:fe6e:64b5  prefixlen 64  scopeid 0x20<link>...(以下省略)