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


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.