1. 程式人生 > >python常見報錯

python常見報錯

NameError: 嘗試訪問一個未申明的變數

>>> foo

Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    foo
NameError: name 'foo' is not defined

ZeroDivisionError: 除數為零

>>> 1/0

Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    1/0
ZeroDivisionError: integer division or modulo by zero

SyntaxError: Python 直譯器語法錯誤

>>> for
SyntaxError: invalid syntax

IndexError:請求的索引超出序列範圍

>>> aList = []
>>> aList[0]

Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    aList[0]
IndexError: list index out of range

KeyError: 請求一個不存在的字典關鍵字

>>> aDict={'host':'earth','port':80}
>>> print aDict['server']

Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    print aDict['server']
KeyError: 'server'

IOError: 輸入/輸出錯誤

>>> f=open("blah")

Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    f=open("blah")
IOError: [Errno 2] No such file or directory: 'blah'

AttributeError: 嘗試訪問未知的物件屬性

>>> class myClass(object):
        pass

>>> myInst = myClass()
>>> myInst.bar = 'spam'
>>> myInst.bar
'spam'
>>> myInst.foo

Traceback (most recent call last):
  File "<pyshell#14>", line 1, in <module>
    myInst.foo
AttributeError: 'myClass' object has no attribute 'foo'

    在我們的例子中, 我們在 myInst.bar 儲存了一個值, 也就是例項 myInst 的 bar 屬性. 屬性被定義後, 我們可以使用熟悉的點/屬性操作符訪問它, 但如果是沒有定義屬性, 例如我們訪問foo 屬性, 將導致一個 AttributeError 異常.

示例1:

#!/usr/bin/env python
def safe_float(obj):
    try:
        retval=float(obj)
    except (ValueError,TypeError),diag:
        retval=str(diag)
    return retval

print safe_float('12.34')
print safe_float('bad input')
print safe_float({'a':'Dict'})

執行結果:

>>>
12.34
invalid literal for float(): bad input
float() argument must be a string or a number
>>>

示例2:

c:\carddata.txt 檔案內容如下

# carddata.txt previous balance
25
debits
21.64
541.24
25
credits
-25
-541.24
finance charge/late fees
7.30
5

程式碼:

#!/usr/bin/env python
def safe_float(obj):
    'safe version of float()'
    try:
        retval=float(obj)
    except (ValueError,TypeError),diag:
        retval=str(diag)
    return retval

def main():
    'handles all the data processing'
    log=open(r'c:\cardlog.txt','w')
    try:
        ccfile=open(r'c:\carddata.txt','r')
    except IOError,e:
        log.write('no txns this month\n')
        log.close()
        return

    txns=ccfile.readlines()
    ccfile.close()
    total=0.00
    log.write('account log:\n')

    for eachTxn in txns:
        result=safe_float(eachTxn)
        if isinstance(result,float):
            total += result
            log.write('[%s]: data... processed\n' %eachTxn.strip())
        else:
            log.write('ignored: [%s] \n' % result.strip())
    print '$%.2f (new balance)' % (total)
    log.close()

if __name__=='__main__':
    main()

執行結果如下:

>>> ================================ RESTART ================================
>>>
$58.94 (new balance)
>>>

cardlog.txt 檔案記錄內容:

account log:
ignored: [invalid literal for float(): # carddata.txt previous balance]
[25]: data... processed
ignored: [invalid literal for float(): debits]
[21.64]: data... processed
[541.24]: data... processed
[25]: data... processed
ignored: [invalid literal for float(): credits]
[-25]: data... processed
[-541.24]: data... processed
ignored: [invalid literal for float(): finance charge/late fees]
[7.30]: data... processed

[5]: data... processed

轉自:http://blog.sina.com.cn/s/blog_6238358c0100gzr5.html