2016-05-23 6 views
0

Учитывая следующий код Python:Как обрабатывать исключение в блоке «finally»?

# Use impyla package to access Impala 
from impala.dbapi import connect 
import logging 

def process(): 
    conn = connect(host=host, port=port) # Mocking host and port 
    try: 
     cursor = conn.cursor() 
     # Execute query and fetch result 
    except: 
     loggin.error("Task failed with some exception") 
    finally: 
     cursor.close() # Exception here! 
     conn.close() 

был создан Подключение к Impala. Но было исключение в cursor.close() из-за таймаута Impala.

Что такое правильный способ закрыть cursor и conn с учетом скрытого исключения?

+0

Подведите 'подключ = подключения (host = host, port = port) ', чтобы попробовать блок. Исключение возникает из-за того, что его исключение из блока try – Tanu

+1

Поместите 'cursor.close()' в блок try, вы должны поместить эти вещи в блок finally, которые обязательно не вызовут никакого исключения. – ZdaR

+0

Исключение может быть сгенерировано, потому что 'conn 'никогда не был установлен. Попробуйте снова поместить эту строку в блок 'try'. –

ответ

2

Вы должны гнездо Попробовать-блоки:

def process(): 
    conn = connect(host=host, port=port) # Mocking host and port 
    try: 
     cursor = conn.cursor() 
     try: 
      # Execute query and fetch result 
     finally: 
      # here cursor may fail 
      cursor.close() 
    except: 
     loggin.error("Task failed with some exception") 
    finally: 
     conn.close() 

Чтобы избежать таких примерочных, наконец-блоки, вы можете использовать with -statement:

def process(): 
    conn = connect(host=host, port=port) # Mocking host and port 
    try: 
     with conn.cursor() as cursor: 
      # Execute query and fetch result 
      # cursor is automatically closed 
    except: 
     loggin.error("Task failed with some exception") 
    finally: 
     conn.close() 

 Смежные вопросы

  • Нет связанных вопросов^_^