python try except 出現異常時,except 中如何返回異常的信息字符串


https://docs.python.org/3/tutorial/errors.html#handling-exceptions

https://docs.python.org/3/library/exceptions.html#ValueError

try:
    int("x")
except Exception as e:
    '''異常的父類,可以捕獲所有的異常'''
    print(e)
# e變量是Exception類型的實例,支持__str__()方法,可以直接打印。 
invalid literal for int() with base 10: 'x'
try:
    int("x")
except Exception as e:
    '''異常的父類,可以捕獲所有的異常'''
    print(e.args)
# e變量有個屬性是.args,它是錯誤信息的元組。

("invalid literal for int() with base 10: 'x'",)try: datetime(2017,2,30)except ValueError as e: print(e) day is out of range for monthtry: datetime(22017,2,30)except ValueError as e: print(e) year 22017 is out of rangetry: datetime(2017,22,30)except ValueError as e: print(e) month must be in 1..12e = Nonetry: datetime(2017,22,30)except ValueError as e: print(e) month must be in 1..12e
# e這個變量在異常過程結束后即被釋放,再調用也無效
 Traceback (most recent call last): File "<input>", line 1, in <module>NameError: name 'e' is not defined

errarg = None
try:
    datetime(2017,22,30)
except ValueError as errarg:
    print(errarg)
    
month must be in 1..12
errarg
Traceback (most recent call last):
  File "<input>", line 1, in <module>
NameError: name 'errarg' is not defined
try:
    datetime(2017,22,30)
except ValueError as errarg:
    print(errarg.args)

# ValueError.args 返回元組

('month must be in 1..12',)
message = None
try:
    datetime(2017,22,30)
except ValueError as errarg:
    print(errarg.args)
    message = errarg.args
    
('month must be in 1..12',)
message
('month must be in 1..12',)
try:
    datetime(2017,22,30)
except ValueError as errarg:
    print(errarg.args)
    message = errarg
    
('month must be in 1..12',)
message
ValueError('month must be in 1..12',)
str(message)
'month must be in 1..12'

分析異常信息,並根據異常信息的提示做出相應處理:

try:
    y = 2017
    m = 22
    d = 30
    datetime(y,m,d)
except ValueError as errarg:
    print(errarg.args)
    message = errarg
    m = re.search(u"month", str(message))
    if m:
        dt = datetime(y,1,d)
        
('month must be in 1..12',)
dt
datetime.datetime(2017, 1, 30, 0, 0)

甚至可以再except中進行遞歸調用:

def validatedate(y, mo, d):
    dt = None
    try:
        dt = datetime(y, mo, d)
    except ValueError as e:
        print(e.args)
        print(str(y)+str(mo)+str(d))
        message = e
        ma = re.search(u"^(year)|(month)|(day)", str(message))
        ymd = ma.groups()
        if ymd[0]:
            dt = validatedate(datetime.now().year, mo, d)
        if ymd[1]:
            dt = validatedate(y, datetime.now().month, d)
        if ymd[2]:
            dt = validatedate(y, mo, datetime.now().day)
    finally:
        return dt
    
validatedate(20199, 16, 33)
('year 20199 is out of range',)
201991633
('month must be in 1..12',)
20181633
('day is out of range for month',)
2018433
datetime.datetime(2018, 4, 20, 0, 0)

 


免責聲明!

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



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