কীভাবে বোটোকোরের নুশচকে ব্যতিক্রম ক্যাপচার করবেন?


105

আমি "ভাল" অজগরটি লেখার চেষ্টা করছি এবং এস -3 এর সাথে এর সাথে কোনও কী ত্রুটি নেই:

session = botocore.session.get_session()
client = session.create_client('s3')
try:
    client.get_object(Bucket=BUCKET, Key=FILE)
except NoSuchKey as e:
    print >> sys.stderr, "no such key in bucket"

তবে NoSuchKey সংজ্ঞায়িত নয় এবং আমি এটি আমদানি করতে পারি না এটির সংজ্ঞা দেওয়া দরকার।

e.__class__এটি botocore.errorfactory.NoSuchKeyকিন্তু from botocore.errorfactory import NoSuchKeyএকটি ত্রুটি দেয় এবং from botocore.errorfactory import *কোনওভাবেই কাজ করে না এবং আমি জেনেরিক ত্রুটি ক্যাপচার করতে চাই না।

উত্তর:


127
from botocore.exceptions import ClientError

try:
    response = self.client.get_object(Bucket=bucket, Key=key)
    return json.loads(response["Body"].read())
except ClientError as ex:
    if ex.response['Error']['Code'] == 'NoSuchKey':
        logger.info('No object found - returning empty')
        return dict()
    else:
        raise

51

বোটোকোর 1.5 ব্যবহার করে, দেখে মনে হচ্ছে ক্লায়েন্ট হ্যান্ডেল ব্যতিক্রম শ্রেণিগুলি প্রকাশ করে:

session = botocore.session.get_session()
client = session.create_client('s3')
try:
    client.get_object(Bucket=BUCKET, Key=FILE)
except client.exceptions.NoSuchKey as e:
    print >> sys.stderr, "no such key in bucket"

আমি এটির জন্য বেছে নিচ্ছি, কারণ এটিটি আরও নতুন এবং কম জেনেরিক। এই পদ্ধতি সম্পর্কে আপনি গিটহাবের উপর কিছু মন্তব্য খুঁজে পেতে পারেন: github.com/boto/boto3/issues/1262#issuecomment-329314670
— সিলেস্টার কার্ডজিওজোনেক

আপনি যদি আমার মতো স্ক্রোল করতে ভুলে যান: আপনি যদি উচ্চ-স্তরের সংস্থান ( s3 = boto3.resource("s3")) ব্যবহার করেন তবে আপনি ক্লায়েন্টটি অ্যাক্সেস করতে পারেন এবং এভাবেই ব্যতিক্রম s3.meta.client.exceptions.NoSuchKey। দেখুন stackoverflow.com/questions/38581465/...
— lorey

32

বোটো 3 এ, আমি রিসোর্সের মেটা ক্লায়েন্টের ব্যতিক্রমটি অ্যাক্সেস করতে সক্ষম হয়েছি।

import boto3

s3 = boto3.resource('s3')
s3_object = s3.Object(bucket_name, key)

try:
    content = s3_object.get()['Body'].read().decode('utf-8')
except s3.meta.client.exceptions.NoSuchKey:
    print("no such key in bucket")

মেটা তথ্য ব্যবহার করা আমার মতে সবচেয়ে মার্জিত উপায়
— তানজা বায়ের

24

আমি মনে করি এটি করার সবচেয়ে মার্জিত উপায়টি বোটো 3 এ in

session = botocore.session.get_session()
client = session.create_client('s3')

try:
    client.get_object(Bucket=BUCKET, Key=FILE)
except client.exceptions.NoSuchKey:
    print("no such key in bucket")

ত্রুটি পরিচালনার বিষয়ে ডকুমেন্টেশনগুলি বিচ্ছিন্ন বলে মনে হয় তবে নিম্নলিখিত ত্রুটি কোডগুলি এতে কাজ করে:

session = botocore.session.get_session()
client = session.create_client('s3')
try:
    try:
        client.get_object(Bucket=BUCKET, Key=FILE)
    except client.exceptions.InvalidBucketName:
        print("no such key in bucket")
except AttributeError as err:
    print(err)

<botocore.errorfactory.S3 অনুভব 0x105e08c50 এ অবজেক্ট অবজেক্ট> অবজেক্টটির কোনও 'অকার্যকরবিকনেম' নেই। বৈধ ব্যতিক্রমগুলি হ'ল: বালতিআলার্ডিএক্সিস্টস, বালতিআলডিআউইনডবাই ইউ, নুশুবুকিট, নসুচকি, নসুচলোড, অবজেক্ট অলডিয়ারআইটিটিভটিয়ার এরির, অবজেক্ট নটআইএনটিটিভটিয়ারিয়র


যে কারণে সম্পর্কযুক্ত নয়, যখন আমি এইভাবে ব্যতিক্রমগুলি ফাঁদে ফেলি তখন তারা প্রচার করে না। (?)
— এভেরেট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.