Pythonの学習34例外処理

1.異常なもの

例外は、プログラムでエラーが発生したことを示す信号です。プログラムでエラーが発生すると例外が発生し、プログラムで処理されない場合は例外が発生し、プログラムの動作が停止します。

エラーは2つのタイプに分けられます。1つは構文エラーSyntaxErrorで、このエラーはプログラムを実行する前に修正する必要があります

>>> if  
  File "<stdin>", line 1 if ^ SyntaxError: invalid syntax

もう1つのカテゴリは論理エラーです。

# TypeError:数字类型无法与字符串类型相加
1+2# ValueError:当字符串包含有非数字的值时,无法转成int类型 num=input(">>: ") #输入hello int(num) # NameError:引用了一个不存在的名字x x # IndexError:索引超出列表的限制 l=['egon','aa'] l[3] # KeyError:引用了一个不存在的key dic={'name':'egon'} dic['age'] # AttributeError:引用的属性不存在 class Foo: pass Foo.x # ZeroDivisionError:除数不能为0 1/0

 

2つの例外処理

プログラムのフォールトトレランスと信頼性を確保するため、つまりエラーが発生した場合、プログラムをクラッシュさせない対応する処理メカニズムがあり、例外に対処する必要があります。処理の基本的な形式は次のとおりです。

try:
    被检测的代码块
except 异常类型: 检测到异常,就执行这个位置的逻辑

try:
    print('start...') print(x) # 引用了一个不存在的名字,触发异常NameError print('end...') except NameError as e: # as语法将异常类型的值赋值给变量e,这样我们通过打印e便可以知道错误的原因 print('异常值为:%s' %e) print('run other code...') #执行结果为 start... 异常值为:name 'x' is not defined run other code...

 

元々、プログラムは例外が発生するとすぐに終了しました。例外処理では、検出されたコードブロックで例外が発生すると、検出されたコードブロックで例外が発生した位置以降のコードは実行されず、一致する例外が実行されますサブコードブロックを除いて、残りのコードは正常に実行されています。

検出されたコードブロックで異なるタイプの例外がトリガーされる可能性がある場合、異なるタイプの例外について:

別のロジックを使用して個別に処理したい場合は、マルチブランチを使用する必要があります(マルチブランチelifと同様、上から下に一致、1回一致、その他は一致しません)。

try:
    被检测的代码块
except NameError: 触发NameError时对应的处理逻辑 except IndexError: 触发IndexError时对应的处理逻辑 except KeyError: 触发KeyError时对应的处理逻辑

def convert_int(obj): try: res=int(obj) except ValueError as e: print('ValueError: %s' %e) res=None except TypeError as e: print('TypeError: %s' %e) res=None return res convert_int('egon') # ValueError: invalid literal for int() with base 10: 'egon' convert_int({'n':1}) # TypeError: int() argument must be a string, a bytes-like object or a number, not 'dict'

 

単一のロジックで複数のタイプの例外を処理したい場合は、複数の例外をタプルに入れ、exceptと一致させることができます

try:
    被检测的代码块
except (NameError,IndexError,TypeError): 触发NameError或IndexError或TypeError时对应的处理逻辑

def convert_int(obj): try: res=int(obj) except (ValueError,TypeError): print('argument must be number or numeric string') res=None return res convert_int('egon') # argument must be number or numeric string convert_int({'n':1}) # argument must be number or numeric string

すべての例外をキャッチしてロジックで処理したい場合、Pythonはユニバーサル例外タイプExceptionを提供します

try:
    被检测的代码块
except NameError: 触发NameError时对应的处理逻辑 except IndexError: 触发IndexError时对应的处理逻辑 except Exception: 其他类型的异常统一用此处的逻辑处理

 

また、multi-branch exceptの後にelseを続けることもできます(elseはafterの後に続く必要があり、単独では存在できません)。elseのサブコードブロックは、検出されたコードブロックが例外をトリガーしない場合にのみ実行されます

try:
    被检测的代码块
except 异常类型1: pass except 异常类型2: pass ...... else: 没有异常发生时执行的代码块

さらに、tryは最終的に、文法的に言えば、finallyと一緒に使用することもできますが、finallyを後に配置する必要がありますが、try-except-finallyの形式を使用できます。また、try-finallyの形式を直接使用することもできます。検出されたコードブロックが例外をトリガーするかどうかに関係なく、finallyサブコードブロックが実行されるため、通常、開いているファイルを閉じる、データベース接続を閉じるなど、いくつかのリソース回復操作がfinallyサブコードブロックで実行されます。

python try: 被检测的代码块 except 异常类型1: pass except 异常类型2: pass ...... else: 没有异常发生时执行的代码块 finally: 无论有无异常发生都会执行的代码块

f=None
try: f=open(db.txt,'r',encoding='utf-8') s=f.read().strip() int(s) # 若字符串s中包含非数字时则会触发异常ValueError # f.close() # 若上面的代码触发异常,则根本不可能执行到此处的代码,应该将关闭文件的操作放到finally中 finally: if f: # 文件存在则f的值不为None f.close()

Pythonインタープリターの構文規則または論理規則が満たされていない場合、Pythonインタープリターによってさまざまなタイプの例外がアクティブにトリガーされ、プログラマーによってカスタマイズされたさまざまな規則の違反については、プログラマー自身が明示的に例外をトリガーする必要があります。 、raiseステートメントを使用します。raiseは異常なクラスまたは異常なインスタンスでなければなりません。

class Student:
    def __init__(self,name,age): if not isinstance(name,str): raise TypeError('name must be str') if not isinstance(age,int): raise TypeError('age must be int') self.name=name self.age=age stu1=Student(4573,18) # TypeError: name must be str stu2=Student('egon','18') # TypeError: age must be int

 

組み込みの例外では不十分な場合は、組み込みの例外クラスを継承して、例外クラスをカスタマイズできます。

class PoolEmptyError(Exception): # 可以通过继承Exception来定义一个全新的异常 def __init__(self,value='The proxy source is exhausted'): # 可以定制初始化方法 super(PoolEmptyError,self).__init__() self.value=value def __str__(self): # 可以定义该方法用来定制触发异常时打印异常值的格式 return '< %s >' %self.value class NetworkIOError(IOError): # 也可以在特定异常的基础上扩展一个相关的异常 pass raise PoolEmptyError # __main__.PoolEmptyError: < The proxy source is exhausted > raise NetworkIOError('连接被拒绝') # __main__.NetworkIOError: 连接被拒绝

最後に、Pythonはassert式assert式も提供します。これは、式が保持されていることをアサートします。それ以外の場合は、次のように、raise-if-notと同じセマンティクスを持つ例外AssertionErrorをトリガーします。

age='18'

# 若表达式isinstance(age,int)返回值为False则触发异常AssertionError
assert isinstance(age,int) # 等同于 if not isinstance(age,int): raise AssertionError

 

3.例外処理を使用する場合

例外処理メカニズムを理解した後、プログラムのフォールトトレランスと信頼性を向上させる目的で、読者は誤ってtry ... except ...をできるだけ多くプログラムに追加する必要があると誤解することがあります。これは過剰な消費です。プログラムの可読性。これは、try ... exceptは本来プログラムに付加する追加のロジックであり、メインの作業とは関係がないためです。

エラー発生の状態が「予測可能」である場合、次のようにifを「防止」するために使用する必要があります

age=input('input your age>>: ').strip() if age.isdigit(): # 可预知只有满足字符串age是数字的条件,int(age)才不会触发异常, age=int(age) else: print('You must enter the number')

 

エラーが発生する条件が「予測不能」、つまり例外をトリガーする必要がある場合は、try ... exceptステートメントを使用して処理する必要があります。たとえば、Webコンテンツをダウンロードする関数を記述します。ネットワークで遅延などの例外が発生するのは正常であり、遅延が発生する状況を予測できないため、例外処理メカニズムのみを使用できます。

import requests
from requests.exceptions import ConnectTimeout # 导入requests模块内自定义的异常 def get(url): try: response=requests.get(url,timeout=3)#超过3秒未下载成功则触发ConnectTimeout异常 res=response.text except ConnectTimeout: print('连接请求超时') res=None except Exception: print('网络出现其他异常') res=None return res get('https://www.python.org')

 

おすすめ

転載: www.cnblogs.com/heirenxilou/p/12715582.html