2012-02-11 122 views
2

我有嘗試,除了蟒蛇塊,我想,當出現異常時什麼也不做。我的代碼如下:忽略異常在Python

for i in range(len(grid)): 
    for j in range(len(grid[i])): 
     try: 
      count = count > int(grid[i][j]) ? count : int(grid[i][j]) 
     except: 
      //Do nothing here 

我怎樣做任何異常被捕獲時。

謝謝。

+9

請不要使用'嘗試:..除了:pass' - 至少指定要忽略的異常類型!否則,當您沒有注意到引發異常時,您可能會在某些時候遇到難以調試的問題。 – ThiefMaster 2012-02-11 20:24:57

+1

如果您要這樣做,我強烈建議您指定要忽略的異常(例如'IndexError')。默默吞下* all *例外是非常糟糕的做法。 – 2012-02-11 20:25:40

+11

是'a? b:c'現在構建有效的Python?我一定錯過了...... – 2012-02-11 20:26:31

回答

12

pass是您正在查找的關鍵字。

+0

工作。非常感謝。 – riship89 2012-02-11 20:29:02

+0

在理論上你可以在其中添加任何表達式*(例如'0')*,但是'pass'只是更加pythonic。 – 2012-02-11 23:27:25

+0

@NiklasR我不太確定。 「0」是一個表達式並且計算爲「0」,「pass」是一個語句。所以,不完全相同。 – snim2 2012-02-12 00:18:38

4
for i in range(len(grid)): 
    for j in range(len(grid[i])): 
     try: 
      count = count > int(grid[i][j]) ? count : int(grid[i][j]) 
     except: 
      pass 
+0

工作。非常感謝。 – riship89 2012-02-11 20:29:08

+2

這總是不會做任何事情,因爲語句中有一個'SyntaxError',並且捕獲所有異常。 – kindall 2012-02-11 20:35:12

+3

@kindall:我不認爲你可以用這種方式捕獲SyntaxError;應該在聲明時提出,而不是在執行期間提出。 – DSM 2012-02-11 20:39:40

3

您可以使用pass,但...在Python 3.x中也是同義詞,這對編寫psuedocode非常有用。

我看到很多人使用pass他們真正需要什麼也不做,而使用...,他們正在使用它作爲一個佔位符。

class SomeInterface: 
    def do_something(self): 
     pass 

class SomeImplementation(SomeInterface): 
    def do_something(self) 
     ... 

這使得它很容易從pass搜索...並找到你沒有實現代碼區,沒有誤報。

注意,通過對異常通常是不好的做法,因爲你幾乎總是希望採取行動例外。您至少應該明確指出要捕獲的確切異常,否則您將捕獲所有異常,可能會導致您無法檢測到的異常,如果不同的異常增加它的頭部。

+3

'......'不是嚴格的同義詞,儘管它不會起作用。這是一個裸體的表達,就像把'None'或'0'或''foo''放在那裏一樣。 '...'評估爲「省略號」單身人士。 – 2012-02-11 21:35:57

+0

@ThomasK真,同義詞是我的一個糟糕的選擇或話語。在這種情況下,它會像通過一樣工作。 – 2012-02-11 22:39:10

0
result = x if a > b else y 

是三元運算符

的什麼都不做聲明

pass 
7

讓我們正確地編寫代碼。

  • 我們想要迭代網格的每個單元格。所以這樣做。不要創建您重複使用並重新編入索引的數字列表(range)。Python的for-loops直接與容器一起工作。這是方便,容易理解和良好的。不要反對。

  • 有沒有?構建在Python。有一個x if y else z構造,但在這裏不合適。您顯然試圖將count設置爲當前值和單元格值的最大值。有一個內置的功能。

  • 你真的想最大所有這些細胞的。所以直接問這個問題。不要以爲你必須自己實現高水印算法。你沒有。 (這也保護你不必爲count選擇一個初始值,這可能是錯誤的。)我們不需要爲此對迭代進行顯式循環。我們可以使用生成器表達式指定要傳遞到max的值列表。

  • 你想「忽略」不能轉換爲整數值。儘管如果這些值的存在可能首先出現,那麼其他代碼可能存在問題:我們可以簡單地進行測試,並過濾出測試失敗的值。

這樣:

def is_integral(value): 
    try: 
     int(value) 
     return True 
    except: 
     return False 


# Now, get the maximum of all the integral values: 
count = max(
    int(cell) for row in grid for cell in row 
    if is_integral(cell) 
) 
+0

對我而言,這對我來說太高了。這是我的第一天。感謝您的建議,但。 – riship89 2012-02-11 20:54:11

+3

在這方面沒有什麼概念上的困難(順便提一句,編程中的「高層次」通常意味着與你認爲它的含義相反,儘管這是可以理解的)。用這種方式編寫代碼比你如何編寫代碼更簡單。它需要**更少的抽象,因爲你沒有嘗試弄清楚這個'range'對象與你的原始列表有什麼關係。試圖教授編程的人通常對什麼是簡單和什麼是困難的問題有一些非常奇怪的想法。他們教所有的東西都不按順序。 :( – 2012-02-11 21:19:12

+0

+1爲解決真正的問題 – bgporter 2012-02-11 21:50:10