Python的try、except異常處理模塊使用方法

互聯架構唠唠嗑 2024-06-27 17:58:36

本文介紹基于Python語言的異常處理模塊try與except,對代碼中出現的報錯加以跳過,從而使得程序繼續運行的方法。

在Python語言中,try語句塊用于包含可能引發異常的代碼,而except語句塊則用于定義在出現異常時要執行的代碼。其基本結構如以下代碼所示:

try: # 可能引發異常的代碼塊 # ...except ExceptionType1: # 處理 ExceptionType1 類型的異常 # ...except ExceptionType2: # 處理 ExceptionType2 類型的異常 # ...else: # 如果沒有發生異常時要執行的代碼 # ...finally: # 無論是否發生異常都要執行的代碼 # ...

通過這種方式,我們就可以讓原本一旦遇到錯誤就會自動中斷運行的程序,對某些指定的報錯內容加以忽視,從而使得雖然出現錯誤但是代碼可以繼續運行。這裏就給出1個具體的例子。

最近,需要按照一定規則對大量遙感影像加以鑲嵌拼接。其中,因爲鑲嵌拼接的規則比較複雜(需要按照空間、時間等多個維度來確定將哪些遙感影像拼接在一起),所以導致每一次待拼接的遙感影像具體數量是不同的——可能對于第1個時間範圍,需要將5景遙感影像需要拼接在一起;但是對于第2個時間範圍,它就沒有任何需要拼接的遙感影像。同時,因爲待處理的時間範圍比較多,所以我們也不可能手動去把每1個時間範圍對應的情況都考慮一遍。

這就導致,對于有遙感影像可以拼接的時間範圍而言,代碼會正常運行;但是對于期間沒有任何遙感影像的時間範圍而言,其拼接函數就會報錯。例如,我這裏使用了arcpy的拼接函數MosaicToNewRaster_management(),那麽對于沒有任何遙感影像的時間範圍,函數就會出現報錯,如下圖所示:

由上圖可以看到,對于前3個時間範圍(也就是2021001、2021009與2021017),其均不會有問題;而對于第4個時間範圍(此時就該2021025這個時間範圍了),由于其沒有任何可以拼接的遙感影像,所以就會報錯。

對此,我們就可以使用Python語言的異常處理模塊try與except,對可能出現的、由于時間範圍內沒有任何遙感影像可以拼接而導致的錯誤加以忽視。

其中,本文的原始代碼如下:

if int(date_str) < time_start + 8: image_file_list.append(image_file)else: arcpy.MosaicToNewRaster_management(image_file_list, output_folder, str(time_start) + ".tif", number_of_bands = 4) print time_start, "finished." time_start += 8 image_file_list[:] = []

而修改後代碼如下:

if int(date_str) < time_start + 8: image_file_list.append(image_file)else: try: arcpy.MosaicToNewRaster_management(image_file_list, output_folder, str(time_start) + ".tif", number_of_bands = 4) print time_start, "finished." except arcpy.ExecuteError: print "MY_ERROR: ", time_start time_start += 8 image_file_list[:] = []

其中,因爲原本會出現錯誤的代碼,就是arcpy的拼接函數MosaicToNewRaster_management()那裏;所以我們需要在這個代碼的位置前使用try——如果不報錯,那麽就先拼接,然後執行print time_start, "finished.",然後再執行最後的time_start += 8那2句代碼;如果報錯了,那麽就不繼續拼接了,而是執行print "MY_ERROR: ", time_start,然後再執行最後的time_start += 8那2句代碼。

其中,arcpy.ExecuteError是arcpy模塊中的一個異常類,是arcpy模塊操作的一般錯誤;我們在執行arcpy模塊的函數時,如果發生錯誤,那麽就會引發arcpy.ExecuteError異常。大家在實際操作時,將這裏的異常類修改爲自己需要的異常類即可。

隨後,運行上述修改後的代碼,如下圖所示:

可以看到,此時就可以完整的走完全部流程了。對于前3個沒有問題的時間範圍(也就是2021001、2021009與2021017),其均會打印finished.;而對于第4個時間範圍(也就是2021025),其因爲遇到了報錯,所以就會打印MY_ERROR:;但是程序不會中斷,而是繼續按照這個邏輯去運行後續的時間範圍,直至所有的時間範圍都被處理。

所以,我們就解決了由于可能具有的arcpy.ExecuteError異常而導致的程序中斷問題;大家在實際使用時,按照自己程序中可能出現的報錯類,對本文出現的arcpy.ExecuteError異常類加以修改即可。

至此,大功告成。

作者:瘋狂學習GIS鏈接:https://juejin.cn/post/7382152932828512256

0 阅读:2

互聯架構唠唠嗑

簡介:感謝大家的關注