2017-01-08 4 views
2

私は自分のデータベースに新しいテーブルを追加できる関数を書いています。表がすでに私は、エラーメッセージを取得存在するとき、私が午前の問題がされています特定の種類のpymysql.err.InternalErrorsを除いて、どうすればよいのですか?

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

をだから私は動作しますが、それはすべての内部エラーを除いている私のコードを除いて追加しました。私は、内部エラーではないと想定している特定のエラーを除いて、どのようにコードを取得するのですか?

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') 

上記のコードは動作しますが、内部エラーの異なるタイプは、それがちょうどことを除いて、表のように既に実際の誤差そのものではなく存在するであろう浮上した場合、以前に述べたように。

+0

@ AChampionの答えを受け入れてください。そして、あなたがもし/他のブロックを掛けることなく、より多くのエラーを処理するには、このアプローチを拡張することができ、エラーコードとエラーメッセージの間のマッピングを有することができ、例外オブジェクトからコードを読み込むという考えを提案しました。より公平になるでしょう。ありがとう! – alecxe

+0

私はもう一つの答えを受け入れました。私は本当にうまく働くことになっているあなたの考えが好きでした。 – ZacAttack

答えて

3

は例えば、変数に例外を割り当て、特定のエラー・コードをテスト:

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

あなたがすることができますがおそらくちょうどprint(msg)

0

あなたはそうのような「除く」の追加キャッチオールを追加することができます。

try: 
    # your code here 
except pymysql.err.InternalError: 
    print('already exists') 
except: 
    print('catch-all exception!') 
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)) 
関連する問題