2015-10-27 45 views
0
def copy_list(t): 
try: 
    if type(t) is list: 
     t_copy=[] 
     n=len(t) 
     i=0 
     while i<n: 
      t_copy.append(t[i]) 
      i+=1 
     return t_copy 
except TypeError: 
     return "Not a list" 

問題是我應該編寫一個函數,它將整數列表作爲輸入並返回它的一個副本。如果輸入不是列表,它應該引發異常。 我無法理解,爲什麼我的代碼無法引發異常,如果該值不是列表類型或輸入是None?爲什麼錯誤處理對None輸入不起作用?

+3

因爲你的'if'語句只會觸發't'作爲一個列表,所以其他語句都不會嘗試在非列表上運行,所以你從來沒有打過任何代碼來提高豁免。 –

+1

你正在捕捉'TypeError'; 'try'塊中的哪一行會引發異常? (此外,因爲你正在捕捉異常,所以你違反了你的函數應該拋出異常的規定,因爲函數應該拋出,所以你不應該在那裏發現錯誤。) –

+0

那麼怎麼能我修改我的代碼以達到except語句? –

回答

0

在try/except塊用於適當地處理由解釋拋出時遇到了意外的或非法的價值,而不是故意引發異常例外。爲此,您需要raise關鍵字。看到這個問題:How to use "raise" keyword in Python

作爲一個建議,你的代碼可能是這個樣子:

def copy_list(t): 
    if isinstance(t, list): 
     t_copy=[] 
     n=len(t) 
     i=0 
     while i<n: 
      t_copy.append(t[i]) 
      i+=1 
     return t_copy 
    else: 
     raise Exception('Not a list') 

編輯:我想你也要去想isinstance功能,我也因此編輯的代碼。關於這方面的信息可以在here找到。

+0

這工作。謝謝 –

+0

不客氣!考慮在他們爲你工作時接受答案,並歡迎來到該網站! http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – McGlothlin

+0

爲了公平起見,對其他答案進行了評論,這個答案通過了飛行色彩的測試。 –

0

您的代碼不會引發異常,因爲您使用if type(t) is list來檢查t的類型是否爲列表。當您提供None作爲輸入時,它不會通過if語句並落空,因此不會返回任何內容並且不會引發異常。

您可以刪除if語句來引發異常。 n=len(t)將觸發一個例外,因爲你不能得到的NoneTypeError: object of type 'NoneType' has no len() )長度,"Not a list"將被退回。

try: 
    t_copy=[] 
    n=len(t) 
    i=0 
    while i<n: 
     t_copy.append(t[i]) 
     i+=1 
    return t_copy 
except TypeError: 
    return "Not a list" 
+0

當傳遞非列表非非值時,此代碼仍然可能會通過測試失敗。 –

+0

它仍然失敗None輸入 –

+0

這不會失敗的無測試,雖然它會失敗,如果通過字典 –

0

只要將它變成一個for循環中,if type應該抓住任何東西。

def copy_list(t): 
    if type(t) is list: 
     t_copy=[] 
     for i in t: 
      t_copy.append(i) 
     return t_copy 
    else: 
     return "Not a list" 
y = None 
x = copy_list(y) 
print x 
y = "abc" 
x = copy_list(y) 
print x 
y = [1,2,3,4,5,6,7,8,9] 
x = copy_list(y) 
print x 

或者更簡潔地說:

def copy_list(t): 
    if type(t) is list: 
     t_copy = list(t) 
     return t_copy 
    else: 
     return "Not a list" 
y = "" 
x = copy_list(y) 
print x,"\t", type(y) 
y = [] 
x = copy_list(y) 
print x,"\t\t", type(y) 
y = None 
x = copy_list(y) 
print x," ", type(y) 
y = 10 
x = copy_list(y) 
print x," ", type(y) 
y = "abc" 
x = copy_list(y) 
print x," ", type(y) 
y = [1,2,3,4] 
x = copy_list(y) 
print x," ", type(y) 
y = ["a",2,"b"] 
x = copy_list(y) 
print x," ", type(y) 
y = {'Name': 'Zara', 'Age': 7, 'Class': 'First'} 
x = copy_list(y) 
print x," ", type(y)  

個結果:

Not a list <type 'str'> 
[]  <type 'list'> 
Not a list <type 'NoneType'> 
Not a list <type 'int'> 
Not a list <type 'str'> 
[1, 2, 3, 4] <type 'list'> 
['a', 2, 'b'] <type 'list'> 
Not a list <type 'dict'> 
+0

它仍然失敗的無輸入 –

+0

@Varun我強烈反對該評論。查看打印結果。 –