Saya mencoba mencari cara melakukan penanganan kesalahan yang tepat dengan boto3.
Saya mencoba membuat pengguna IAM:
def create_user(username, iam_conn):
try:
user = iam_conn.create_user(UserName=username)
return user
except Exception as e:
return e
Ketika panggilan untuk create_user berhasil, saya mendapatkan objek rapi yang berisi kode status http dari panggilan API dan data pengguna yang baru dibuat.
Contoh:
{'ResponseMetadata':
{'HTTPStatusCode': 200,
'RequestId': 'omitted'
},
u'User': {u'Arn': 'arn:aws:iam::omitted:user/omitted',
u'CreateDate': datetime.datetime(2015, 10, 11, 17, 13, 5, 882000, tzinfo=tzutc()),
u'Path': '/',
u'UserId': 'omitted',
u'UserName': 'omitted'
}
}
Ini sangat bagus. Tetapi ketika ini gagal (seperti jika pengguna sudah ada), saya hanya mendapatkan objek bertipe botocore.exceptions.ClientError dengan hanya teks untuk memberi tahu saya apa yang salah.
Contoh: ClientError ('Terjadi kesalahan (EntityAlreadyExists) saat memanggil operasi CreateUser: Pengguna dengan nama dihilangkan sudah ada.',)
Ini (AFAIK) membuat penanganan kesalahan sangat sulit karena saya tidak bisa hanya mengaktifkan kode status http yang dihasilkan (409 untuk pengguna sudah ada sesuai dengan dokumen AWS API untuk IAM). Ini membuat saya berpikir bahwa saya harus melakukan sesuatu dengan cara yang salah. Cara optimal adalah agar boto3 tidak pernah melempar pengecualian, tetapi jutsu selalu mengembalikan objek yang mencerminkan bagaimana panggilan API berjalan.
Adakah yang bisa memberi tahu saya tentang masalah ini atau mengarahkan saya ke arah yang benar?
Jawaban:
Gunakan respons yang terkandung dalam pengecualian. Berikut ini sebuah contoh:
Dit respons dalam pengecualian akan berisi yang berikut:
['Error']['Code']
mis. 'EntityAlreadyExists' atau 'ValidationError'['ResponseMetadata']['HTTPStatusCode']
mis. 400['ResponseMetadata']['RequestId']
misalnya 'd2b06652-88d7-11e5-99d0-812348583a35'['Error']['Message']
mis. "Terjadi kesalahan (EntityAlreadyExists) ..."['Error']['Type']
misalnya 'Pengirim'Untuk informasi lebih lanjut, lihat penanganan kesalahan botocore .
[Diperbarui: 2018-03-07]
AWS Python SDK telah mulai mengekspos pengecualian layanan pada klien (meskipun tidak pada sumber daya ) yang dapat Anda tangkap secara eksplisit, jadi sekarang mungkin untuk menulis kode itu seperti ini:
Sayangnya, saat ini tidak ada dokumentasi untuk pengecualian ini.
sumber
200
cek Anda, karena kode pengembalian bisa berupa2xx
kode status HTTP yang berbeda (misalnya,204
saat menghapus vault atau arsip,201
saat membuat, dll.). Paling-paling, seseorang harus memeriksa kode non-4xx (misalnya,statusCode < 400
) tapi itu benar-benar rapuh dan saya tidak akan merekomendasikannya: lebih baik mengandalkanboto
pengecualian melemparkan pada kode Anda.Saya merasa sangat berguna, karena Pengecualian tidak didokumentasikan, untuk mendaftar semua pengecualian ke layar untuk paket ini. Berikut adalah kode yang saya gunakan untuk melakukannya:
Yang mengakibatkan:
sumber
Hanya pembaruan untuk masalah 'tidak ada pengecualian pada sumber daya' seperti yang ditunjukkan oleh @jarmod (jangan ragu untuk memperbarui jawaban Anda jika di bawah ini tampaknya berlaku)
Saya telah menguji kode di bawah ini dan itu berjalan dengan baik. Ini menggunakan 'sumber daya' untuk melakukan sesuatu, tetapi menangkap
client.exceptions
- meskipun 'kelihatannya' agak salah ... itu menguji baik, kelas pengecualian menunjukkan dan cocok ketika melihat ke dalam menggunakan debugger pada waktu pengecualian ...Ini mungkin tidak berlaku untuk semua sumber daya dan klien, tetapi berfungsi untuk folder data (alias ember s3).
Semoga ini membantu...
sumber
s3.meta.client.exceptions.NoSuchBucket
s3
adalah sumber daya layanan, miss3 = boto3.resource('s3')
. Bekerja juga untuk sumber daya aktual, seperti ember:boto3.resource('s3').Bucket('bucket-name').meta.client.exceptions. ...
Seperti beberapa orang lain yang telah disebutkan, Anda dapat menangkap kesalahan tertentu menggunakan klien layanan (
service_client.exceptions.<ExceptionClass>
) atau sumber daya (service_resource.meta.client.exceptions.<ExceptionClass>
), namun tidak terdokumentasi dengan baik (juga pengecualian yang dimiliki klien mana). Jadi, inilah cara mendapatkan pemetaan lengkap pada saat penulisan (Januari 2020) di kawasan UE (Irlandia) (eu-west-1
):Ini adalah bagian dari dokumen yang cukup besar:
sumber
Atau perbandingan pada nama kelas misalnya
Karena mereka dibuat secara dinamis, Anda tidak dapat mengimpor kelas dan menangkapnya menggunakan Python asli.
sumber
except Exception as e
dan kemudian memiliki pernyataan if untuk menentukan pengecualian spesifik? Bagaimana itu berbeda dari / lebih baik daripada menangkap pengecualian tertentu? Ini lebih banyak baris, dan Anda perlu mengimpor perpustakaan untuk mendapatkan nama kelasnya. Kecuali Anda ingin menggunakan hardcoding nama pengecualian. Secara keseluruhan, sepertinya cara yang buruk untuk melakukannya.Jika Anda memanggil sign_up API (AWS Cognito) menggunakan Python3, Anda dapat menggunakan kode berikut.
error.response ['Error'] ['Code'] akan menjadi InvalidPasswordException, UsernameExistsException dll. Jadi di fungsi utama atau tempat Anda memanggil fungsi, Anda dapat menulis logika untuk memberikan pesan yang bermakna kepada pengguna.
Contoh untuk respons (error.response):
Untuk referensi lebih lanjut: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/cognito-idp.html#CognitoIdentityProvider.Client.sign_up
sumber
Jika Anda harus berurusan dengan
logs
klien yang bisa dibilang tidak ramah ( CloudWatch Logsput-log-events
), inilah yang harus saya lakukan untuk menangkap dengan benar pengecualian klien Boto3:Ini berfungsi baik pada upaya pertama (dengan LogStream kosong) dan yang berikutnya.
sumber
Mengikuti pembaruan @ armod tentang pengecualian yang ditambahkan langsung pada
client
objek. Saya akan menunjukkan bagaimana Anda dapat melihat semua pengecualian yang ditentukan untuk kelas klien Anda.Pengecualian dihasilkan secara dinamis saat Anda membuat klien dengan
session.create_client()
atauboto3.client()
. Secara internal ia memanggil metodebotocore.errorfactory.ClientExceptionsFactory._create_client_exceptions()
dan mengisiclient.exceptions
bidang dengan kelas pengecualian yang dibangun.Semua nama kelas tersedia dalam
client.exceptions._code_to_exception
kamus, sehingga Anda dapat membuat daftar semua jenis dengan cuplikan berikut:Semoga ini bisa membantu.
sumber
Anda perlu melakukan sesuatu saat gagal menangani masalah tersebut. Saat ini Anda mengembalikan pengecualian yang sebenarnya. Misalnya, jika ini bukan masalah bahwa pengguna sudah ada dan Anda ingin menggunakannya sebagai fungsi get_or_create mungkin Anda menangani masalah dengan mengembalikan objek pengguna yang ada.
Yang mengatakan, mungkin itu adalah masalah untuk aplikasi Anda, dalam hal ini Anda ingin ingin menempatkan penangan pengecualian di sekitar kode yang disebut fungsi buat pengguna Anda dan biarkan fungsi panggilan menentukan cara menghadapinya, misalnya, dengan bertanya pengguna untuk memasukkan nama pengguna lain, atau apa pun yang masuk akal untuk aplikasi Anda.
sumber