2017-01-08 1 views
2

내 데이터베이스에 새 테이블을 추가 할 수있는 함수를 작성 중입니다. 특정 종류의 pymysql.err.InternalErrors를 제외하고 어떻게합니까?

pymysql.err.InternalError: (1050, "Table 'doesthiswork' already exists") 

그래서 내가 일 내 코드를 제외하고는 추가하지만 모든 내부 오류를 제외한다 : 테이블이 이미 나는 오류 메시지가있을 때 나는 데 문제입니다. 나는 내부 오류가 아닌 1050이라고 가정하고있는 특정 오류를 제외하고 내 코드를 어떻게 얻을 수 있습니까?

import pymysql 

def CreateTable(Host,User,Password,DataBase,TableName): 

    try: 
     conn = pymysql.connect(
          host = Host, 
          user = User, 
          password= Password, 
          db = DataBase 
         ) 
     a = conn.cursor() 
     tblName = TableName 
     sql = 'CREATE TABLE'+" "+ tblName + '(try varchar(128));' 

     a.execute(sql) 

    except pymysql.err.InternalError: 
     print (tblName + " " + 'already exist') 

위의 코드는 작동하지만, 내부 오류의 다른 유형이 그냥 제외하고는 테이블로 이미 실제 오류 자체를하지 존재하는 것이 표면화 경우 앞서 언급한다.

except pymysql.err.InternalError as e: 
    code, msg = e.args 
    if code == 1050: 
     print(tblName, 'already exists') 

당신은 할 수 있지만 : 예를 들어,

try: 
    # your code here 
except pymysql.err.InternalError: 
    print('already exists') 
except: 
    print('catch-all exception!') 
+0

에서 @ AChampion의 답변을 받아주세요 사람 예외 객체로부터 코드를 읽는 아이디어를 제안했다. 더 공평 하리라. 감사! – alecxe

+0

나는 다른 대답을 받아 들였고, 나는 정말로 잘 작동 할 수있는 당신의 생각을 좋아했다. – ZacAttack

답변

3

변수에 예외를 할당하고 특정 오류 코드를 테스트 :

0

당신은 너무 좋아요 "를 제외하고"추가 포괄을 추가 할 수 있습니다 아마도 print(msg) 일 것입니다.

2

코드 값을 하드 코드 할 필요가 없으며 pymysql.constants.ER module에서 사용할 수 있습니다. 그리고 당신은 경우/다른 블록 곱하지 않고 더 많은 오류를 처리에이 방법을 확장하는 데 도움이 될 수있는 오류 코드 및 오류 메시지 사이의 매핑을 가질 수 있습니다 그가 처음으로

from pymysql.constants import ER 

error_codes = { 
    ER.TABLE_EXISTS_ERROR: "Table already exists", 
    ER.ACCESS_DENIED_ERROR: "Access denied" 
} 

try: 
    # ... 
except pymysql.err.InternalError as e: 
    code, msg = e.args 
    print(error_codes.get(code, msg)) 
관련 문제