Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Analisis contoh pengendalian pengecualian dalam Python

Analisis contoh pengendalian pengecualian dalam Python

WBOY
WBOYke hadapan
2023-05-16 14:28:061528semak imbas

    1 Apakah pengecualian

    Dalam python, pengecualian yang dicetuskan oleh ralat adalah seperti berikut

    Analisis contoh pengendalian pengecualian dalam Python

    2. Jenis pengecualian

    Pengecualian yang berbeza dalam ular sawa boleh dikenal pasti oleh jenis yang berbeza Pengecualian mengenal pasti ralat.

    1. Kelas pengecualian biasa

    • AttributeError Cuba mengakses pokok yang tidak mempunyai objek, seperti foo.x, tetapi foo tidak mempunyai atribut x

    • Pengecualian input/output IOError pada asasnya tidak boleh membuka fail

    • ImportError tidak boleh mengimport modul atau pakej pada asasnya masalah laluan atau nama yang salah

    • Ralat sintaks IndentationError (subkelas); kod tidak diselaraskan dengan betul

    • IndexError Indeks subskrip melebihi sempadan jujukan, contohnya, apabila x mempunyai tiga elemen sahaja , tetapi cuba mengakses x[5]

    • KeyError Mencuba mengakses kunci yang tidak wujud dalam kamus

    • KeyboardInterrupt Ctrl+C telah ditekan

    • NameError menggunakan pembolehubah yang belum diberikan objek

    • SyntaxError Kod Python adalah menyalahi undang-undang dan kod tidak boleh disusun ( Saya secara peribadi berpendapat ini adalah ralat sintaks dan telah ditulis secara salah)

    • TypeError Jenis objek yang masuk tidak memenuhi keperluan

    • UnboundLocalError cuba untuk akses pembolehubah tempatan yang belum ditetapkan, pada asasnya disebabkan oleh pembolehubah global yang lain dengan nama yang sama, menyebabkan anda berfikir anda sedang mengaksesnya

    • ValueError Melepasi nilai yang pemanggil tidak menjangka, walaupun nilainya adalah jenis yang betul

    2 Contoh pengecualian:

    # TypeError:int类型不可迭代
    for i in 3:
        pass
    
    # ValueError
    num=input(">>: ") #输入hello
    int(num)
    
    # NameError
    aaa
    
    # IndexError
    l=['egon','aa']
    l[3]
    
    # KeyError
    dic={'name':'egon'}
    dic['age']
    
    # AttributeError
    class Foo:pass
    Foo.x
    
    # ZeroDivisionError:无法完成计算
    res1=1/0
    res2=1+'str'

    3. Pengendalian pengecualian

    1 cuba sintaks...kecuali

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

    Contoh

    try:
        f = [ 'a', 'a', 'a','a','a', 'a','a',]
        g = (line.strip() for line in f) #元组推导式
        print(next(g))
        print(next(g))
        print(next(g))
        print(next(g))
        print(next(g))
    except StopIteration:
        f.close()

    Kelas pengecualian hanya boleh digunakan untuk mengendalikan pengecualian yang tidak ditentukan tidak boleh dikendalikan.

    s1 = 'hello'
    try:
        int(s1)
    except IndexError as e:  # 未捕获到异常,程序直接报错
        print(e)

    2. Pengecualian berbilang cawangan kecuali..kecuali dan pengecualian sejagat: Pengecualian

    s1 = 'hello'
    try:
        int(s1)
    except IndexError as e:
        print(e)
    except KeyError as e:
        print(e)
    except ValueError as e:
        print(e)
    except Exception as e:
        print(e)

    3. cuba/kecuali...lain

    Ada satu lagi cubaan/kecuali pernyataan Klausa lain pilihan, jika digunakan, mesti diletakkan selepas semua kecuali klausa.

    Klausa else akan dilaksanakan apabila tiada pengecualian berlaku dalam klausa cuba.

    for arg in sys.argv[1:]:
        try:
            f = open(arg, 'r')
        except IOError:
            print('cannot open', arg)
        else:
            print(arg, 'has', len(f.readlines()), 'lines')
            f.close()

    4. Pelaksanaan akhir pengecualian akhirnya

    Pernyataan cuba-akhir akan melaksanakan kod akhir tanpa mengira sama ada pengecualian berlaku.

    Tentukan tingkah laku pembersihan:

    s1 = 'hello'
    try:
        int(s1)
    except IndexError as e:
        print(e)
    except KeyError as e:
        print(e)
    except ValueError as e:
        print(e)
    #except Exception as e:
    #    print(e)
    else:
        print('try内代码块没有异常则执行我')
    finally:
        print('无论异常与否,都会执行该模块,通常是进行清理工作')

    #tidak sah literal untuk int() dengan asas 10: 'hello'

    #Modul ini akan dilaksanakan tanpa mengira pengecualian atau tidak, biasanya Jalankan kerja pembersihan

    4. Lemparkan kenaikan pengecualian

    Python menggunakan pernyataan kenaikan untuk melontarkan pengecualian yang ditentukan. Format sintaks

    raise adalah seperti berikut:

    raise [Exception [, args [, traceback]]]
    try:
        raise TypeError('抛出异常,类型错误')
    except Exception as e:
        print(e)

    raise Satu-satunya parameter menentukan pengecualian untuk dilemparkan. Ia mestilah contoh pengecualian atau kelas pengecualian (iaitu, subkelas Pengecualian).

    Jika anda hanya ingin tahu sama ada ini memberikan pengecualian dan tidak mahu mengendalikannya, maka kenyataan kenaikan yang mudah boleh menimbulkannya semula.

    try:
            raise NameError('HiThere')
        except NameError:
            print('An exception flew by!')
            raise
       
    #An exception flew by!
    #Traceback (most recent call last):
    #  File "", line 2, in ?
    #NameError: HiThere

    5 Pengecualian tersuai

    Anda boleh mempunyai pengecualian anda sendiri dengan membuat kelas pengecualian baharu. Kelas pengecualian mewarisi daripada kelas Pengecualian, sama ada secara langsung atau tidak langsung, contohnya:

    Dalam contoh ini, lalai __init__() kelas Pengecualian ditindih.

    class EgonException(Exception):
        def __init__(self, msg):
            self.msg = msg
    
        def __str__(self):
            return self.msg
    
    
    try:
        raise EgonException('抛出异常,类型错误')
    except EgonException as e:
        print(e) 
    
    #抛出异常,类型错误

    Kelas pengecualian asas

    Apabila mencipta modul yang mungkin membuang pelbagai pengecualian berbeza, pendekatan biasa ialah mencipta kelas pengecualian asas untuk pakej ini, dan kemudian membina Kelas asas ini cipta subkelas yang berbeza untuk keadaan ralat yang berbeza:

    Kebanyakan nama pengecualian berakhir dengan "Ralat", sama seperti penamaan pengecualian standard.

    class Error(Exception):
        """Base class for exceptions in this module."""
        pass
     
    class InputError(Error):
        """Exception raised for errors in the input.
     
        Attributes:
            expression -- input expression in which the error occurred
            message -- explanation of the error
        """
     
        def __init__(self, expression, message):
            self.expression = expression
            self.message = message
     
    class TransitionError(Error):
        """Raised when an operation attempts a state transition that's not
        allowed.
     
        Attributes:
            previous -- state at beginning of transition
            next -- attempted new state
            message -- explanation of why the specific transition is not allowed
        """
     
        def __init__(self, previous, next, message):
            self.previous = previous
            self.next = next
            self.message = message

    6. Assert

    assert (assert) digunakan untuk menilai ungkapan dan mencetuskan pengecualian apabila syarat ungkapan itu palsu.

    Penegasan boleh terus mengembalikan ralat apabila syarat tidak dipenuhi untuk program berjalan, tanpa perlu menunggu program ranap selepas berjalan.

    Format sintaks adalah seperti berikut:

    assert expression

    bersamaan dengan:

    if not expression:
        raise AssertionError

    menegaskan juga boleh diikuti oleh parameter:

    assert expression [, arguments]

    bersamaan dengan:

    if not expression:
        raise AssertionError(arguments)

    Contoh berikut menentukan sama ada sistem semasa adalah Linux Jika syarat tidak dipenuhi, pengecualian akan dicetuskan terus tanpa melaksanakan kod seterusnya:

    import sys
    assert ('linux' in sys.platform), "该代码只能在 Linux 下执行"
    # 接下来要执行的代码
    
    # Traceback (most recent call last):
    #    File "C:/PycharmProjects/untitled/run.py", line 2, in 
    #      assert ('linux' in sys.platform), "该代码只能在 Linux 下执行"
    #  AssertionError: 该代码只能在 Linux 下执行
    .

    Atas ialah kandungan terperinci Analisis contoh pengendalian pengecualian dalam Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    Kenyataan:
    Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam