Python全棧工程師(異常(基礎))

 

 

ParisGabriel
 
 
 
         天天堅持手寫  一天一篇  決定堅持幾年 爲了夢想爲了信仰
 
   

                      Python人工智能從入門到精通python

 

 

 

 

補充:包的相對導入 只對後兩種導入方式有用  前兩次改進的學生管理系統在20課中 已補充app

 

 

 



異常(基礎)except:
  什麼是錯誤:
    是指因爲邏輯或語法等導程序沒法正常執行的問題
  什麼是異常:
    是程序出錯的標識符的一種狀態
    當異常發時 程序會再向下執行,而轉去調用此函數的地方
    待處理此錯誤並恢復正常狀態
  異常的做用:
    用做信號, 通知上層調用者有錯誤產生須要處理
try 語句
  兩種語法:
    ry-except語句(接受異常通知)
    try-finally語句
try-except 語法
   try:
    可能觸發異常的語句
    except 錯誤類型1[as 變量1]:
      異常處理語句2
    except 錯誤類型2[as 變量2]:
       異常處理語句2
    except (錯誤類型3, 錯誤類型4,...)[as 變量3]:
       異常處理語句3
    ......
    except:
      異常處理語句(其餘)(匹配全部類型錯誤)
    else:
      未發生異常語句(能夠沒有此語句 沒有發成異常時調用)
    finlly:
      最終語句
 做用:
   嘗試捕獲異常程序由異常狀態轉爲正常狀態並正常執行函數

    說明:ui

   1. as 子句是用於綁定錯誤對象的變量,能夠省略
   2. except 子句能夠有一個或多個,但至少要有一個
   3. else 子句最多只能有一個,也能夠省略不寫
   4. finally 子句最多只能有一個,也能夠省略不寫
   5. else 子句將在try沒有出現異常時執行
   6. finally子句的語句在任何狀況下都會被執行編碼


示例:人工智能

# 此示例示意用try-except 語句捕獲異常並作出相應的處理
def div_apple(n):
    print("%d個蘋果您想分給幾我的?" % n)
    s = input("請輸入人數: ")
    cnt = int(s)  # <- 此處可能觸發ValueError類型錯誤
    result = n / cnt  # <- 此處可能觸發ZeroDivisitionError錯誤
    print("每一個人分了%d個蘋果" % result)


try:
    print("開始分蘋果")
    div_apple(10)  # 可能觸發異常的調用
    print("結束分蘋果")
except ValueError:
    print("發生成值錯誤,已處理並轉爲正常狀態!")
except ZeroDivisionError:
    print("發生了被零除的錯誤,程序已轉爲正常狀態")


print("程序正常執行並徹底任務,退出程序")

 

try-finally語法
  try:
      可能觸發異常的語句
  finally:
    最終語句
 說明:
   1.finally子句不能夠省略
   2.必定不存在except子句
 做用:
   一般try-finally語句來作觸發異常時必需要處理的事情
   不管異常是否發生 finally子句必定會被執行
 注意:
   try-finally 語句不會改變程序的(正常/異常)狀態spa

 示例:操作系統

# 如下以 煎蛋爲例示意 try-finally語句的用法
# 必需要作的事情是,關閉天燃氣

def fry_egg():
    print("打開天燃氣點燃...")
    try:
        count = int(input("請輸入雞蛋個數: "))
        print("完成煎雞蛋,共煎了%d個雞蛋" % count)
    finally:
        print("關閉天燃氣")


fry_egg()

 

 

raise 語句:(發起異常通知)
  做用:
    觸發一個錯誤, 讓程序進入異常狀態
  語法:
    raise 異常類型
    或
    raise 異常對
  實例:code

 

def make_exception():
    print("函數開始")
    # 發出一個ValueError類型的錯誤通知給調用者
    # raise ValueError
    err = ValueError("這是自定義的錯誤數據")
    raise err  # 用 err觸發一個異常通知
    print("函數結束")


try:
    make_exception()
    print("make_exception調用結束!")
except ValueError as e:
    print("接收到ValueError類型的異常通知")
    print("錯誤對象是:", e)

 

assert 斷言語句:
  語法:
    assert 真值表達式, 錯誤數據(一般是字符串)
  做用:
    當真值表達式爲False時, 用錯誤數據建立一個AssertionError
    類型的錯誤, 並進入異常狀態
  等同於:
    if 真值表達式 == false
      raise AssertrtionError(錯誤數據)
  實例:對象

 

def get_score():
    s = int(input("請輸入學生成績: "))
    assert 0 <= s <= 100, '成績超出範圍'
    # if not (0 <= s <= 100):
    #     raise AssertionError('成績超出範圍')
    return s


try:
    score = get_score()
except AssertionError as err:
    print("錯誤數據是:", err)
    print('獲取成績失敗')
    score = 0

print("學生的成績爲:", score)

 


    小結:
      異常處理語句(4條):
        try-except 語句:
          用於接受異常通知, 捕獲異常
        try-finally 語句:
          執行必須執行的語句
        raise 語句:
          發送異常通知, 並進入異常狀態
        assert 語句:
          根據條件選着性的發送 AssertionError類型的異常通知
爲何要處理異常機制:
  在程序調用層比較深的時候, 向主調用函數傳遞錯誤信息 須要層層return返回
  比較麻煩用異常處理機制能夠較簡單傳遞錯誤信息

 

    

Python所有的錯誤類型

 

 

錯誤類型 說明
如下內容必講  
ZeroDivisionError 除(或取模)零 (全部數據類型)
ValueError 傳入無效的參數
AssertionError 斷言語句失敗
StopIteration 迭代器沒有更多的值
IndexError 序列中沒有此索引(index)
IndentationError 縮進錯誤
OSError 輸入/輸出操做失敗
ImportError 導入模塊/對象失敗
NameError 未聲明/初始化對象 (沒有屬性)
AttributeError 對象沒有這個屬性
   
GeneratorExit 生成器(generator)發生異常來通知退出
TypeError 對類型無效的操做
KeyboardInterrupt 用戶中斷執行(一般是輸入^C)
OverflowError 數值運算超出最大限制
FloatingPointError 浮點計算錯誤
BaseException 全部異常的基類
SystemExit 解釋器請求退出
Exception 常規錯誤的基類
StandardError 全部的內建標準異常的基類
ArithmeticError 全部數值計算錯誤的基類
EOFError 沒有內建輸入,到達EOF 標記
EnvironmentError 操做系統錯誤的基類
WindowsError 系統調用失敗
LookupError 無效數據查詢的基類
KeyError 映射中沒有這個鍵
MemoryError 內存溢出錯誤(對於Python 解釋器不是致命的)
UnboundLocalError 訪問未初始化的本地變量
ReferenceError 弱引用(Weak reference)試圖訪問已經垃圾回收了的對象
RuntimeError 通常的運行時錯誤
NotImplementedError 還沒有實現的方法
SyntaxError Python 語法錯誤
TabError Tab 和空格混用
SystemError 通常的解釋器系統錯誤
UnicodeError Unicode 相關的錯誤
UnicodeDecodeError Unicode 解碼時的錯誤
UnicodeEncodeError Unicode 編碼時錯誤
UnicodeTranslateError Unicode 轉換時錯誤
如下爲警告類型  
Warning 警告的基類
DeprecationWarning 關於被棄用的特徵的警告
FutureWarning 關於構造未來語義會有改變的警告
OverflowWarning 舊的關於自動提高爲長整型(long)的警告
PendingDeprecationWarning 關於特性將會被廢棄的警告
RuntimeWarning 可疑的運行時行爲(runtime behavior)的警告
SyntaxWarning 可疑的語法的警告
UserWarning 用戶代碼生成的警告
詳見:help(builtins)

 

 

練習:
寫一個函數 get_score() 來獲取學生成績,
要求用戶輸入 1~100的整數,輸果輸入出現異常,返此函數返回0,
不然返回用戶輸入的成績
示例:
def get_score():
...
score = get_score()
print("學生的成績是:", score)

 

 

練習:
1. 一個球從100米高空落下 ,每次落地後反彈高度是原高度的一半, 在落下
1)寫程序算出皮球在第10次落地後反彈高度是多高?
2)打印出球共通過多少米的路程

 

答案:

def ball(n, m):
    L = [100]
    while True:
        if n == 0:
            print("最後彈起的高度是%s米" % s)
            break
        s = m * 0.5
        m = s
        L.append(s + m)
        n -= 1
    return L
print("10次共經歷了%s米的路程" % sum(ball(10, 100)))

 


2. 分解質因數, 輸入一個整數, 分解質因數 ,
如:
輸入 90
則打印:
「90=2*3*3*5」
(質因數是指最小能被原數整除的素數 不包括1)

答案:

def m(n):
    ret = []
    while n > 1:
        for i in range(n):
            k = i + 2
            if n % k == 0:
                ret.append(k)
                n = int(n / k)
                break
    return ret

print(m(90))

 

 

 

 

3. 修改原學生信息管理程序,加入異常處理語句,讓程序在任何狀況下都可以按邏輯正常執行. 例如: 輸入成績和年齡時,若是用戶輸入非法字符串也不會致使程序崩潰

相關文章
相關標籤/搜索