এক লাইনে একাধিক ব্যতিক্রম ধরা (ব্লক ব্যতীত)


2753

আমি জানি যে আমি এটি করতে পারি:

try:
    # do something that may fail
except:
    # do this if ANYTHING goes wrong

আমি এটিও করতে পারি:

try:
    # do something that may fail
except IDontLikeYouException:
    # say please
except YouAreTooShortException:
    # stand on a ladder

তবে আমি যদি দুটি ভিন্ন ব্যতিক্রমের মধ্যে একই জিনিসটি করতে চাই তবে আমি এখনই সবচেয়ে ভালভাবে ভাবতে পারি তা হ'ল:

try:
    # do something that may fail
except IDontLikeYouException:
    # say please
except YouAreBeingMeanException:
    # say please

আমি এর মতো কিছু করার কি কোনও উপায় আছে (যেহেতু উভয় ব্যতিক্রম গ্রহণের পদক্ষেপটি হ'ল say please):

try:
    # do something that may fail
except IDontLikeYouException, YouAreBeingMeanException:
    # say please

এখন এটি সত্যিই কাজ করবে না, কারণ এটি সিনট্যাক্সের সাথে মেলে:

try:
    # do something that may fail
except Exception, e:
    # say please

সুতরাং, দুটি স্বতন্ত্র ব্যতিক্রম ধরার জন্য আমার প্রচেষ্টাটি ঠিক তেমনটি ঘটেনি।

এই কাজ করতে একটি উপায় আছে কি?


6
দ্রষ্টব্য যে পাইথন 3 এ, পরবর্তীটি আর বৈধ বাক্য গঠন নয়।
অঙ্কিত 14

উত্তর:


3720

পাইথন ডকুমেন্টেশন থেকে :

উদাহরণস্বরূপ, একটি ক্লজ ব্যতীত একাধিক ব্যতিক্রমের নাম প্যারেন্টেসাইজড টিপল হিসাবে থাকতে পারে

except (IDontLikeYouException, YouAreBeingMeanException) as e:
    pass

বা, পাইথন 2 এর জন্য:

except (IDontLikeYouException, YouAreBeingMeanException), e:
    pass

কমা দিয়ে ভেরিয়েবল থেকে ব্যতিক্রম পৃথক করা পাইথন ২.6 এবং ২.7 এ এখনও কাজ করবে তবে এখন অবহেলিত এবং পাইথন 3 এ কাজ করে না; এখন আপনি ব্যবহার করা উচিত as


9
আমি এটি দিয়ে চেষ্টা করেছি ... এর সাথে listএবং এর ফলশ্রুতিতে এ TypeError। দেখে মনে হচ্ছে ত্রুটিগুলি অবশ্যই tupleপ্রত্যাশা অনুযায়ী কাজ করার জন্য থাকা উচিত ।
বলপয়েন্টবেন

4
আপনি কখনই একটি তালিকা ব্যবহার করবেন যখন আপনি স্পষ্টভাবে দেখতে পাচ্ছেন যে এটি নথিভুক্ত রয়েছে যে এই ক্ষেত্রে একটি টিপলের প্রয়োজন আছে?
যান্ত্রিক_মেট

6
"প্রথম বন্ধনীযুক্ত টিউপল" নিছক সিনট্যাকটিকাল ছিল বা একটি উদ্দীপনা জাগানো টিউপলের প্রয়োজন ছিল কিনা তা স্পষ্ট ছিল না। "প্যারেনথেসাইজড" বিভ্রান্ত করছে কারণ আপনি অন্য কোথাও প্রথম বন্ধনী ছাড়াই একটি টিপল তৈরি করতে পারেন এবং তারপরে exceptলাইনে ব্যবহার করতে পারেন । exceptলাইনে তৈরি করা থাকলে এটি কেবল অগত্যা প্যারেন্থাইজড ।
বলপয়েন্টবেন

5
@ জোসেফবাণী, জেনারেটর এক্সপ্রেশন সম্পর্কে কী?
জামারথেপ্রগ্রামার

12
@ জোসেফবাণী এটি মোটেও সত্য নয়। ইন 2 + (x * 2), (x * 2)অবশ্যই একটি tuple নয়। প্যারেন্টিসেস একটি সাধারণ গ্রুপিং কনস্ট্রাক্ট। টিউপলের নির্ধারিত বৈশিষ্ট্যটি হ'ল এতে একটি কমা রয়েছে - পাইথন ডকুমেন্টেশন দেখুন : "নোট করুন যে এটি আসলে কমা যা একটি টুপল তৈরি করে, প্রথম বন্ধনী নয়" "
সোরেন জর্নস্ট্যাড

314

আমি কীভাবে এক লাইনে একাধিক ব্যতিক্রম ধরব (ব্লক ব্যতীত)

এটা কর:

try:
    may_raise_specific_errors():
except (SpecificErrorOne, SpecificErrorTwo) as error:
    handle(error) # might log or have some other default behavior...

পুরানো সিনট্যাক্সের কারণে প্রথম বন্ধনীগুলি আবশ্যক যা কোনও নামতে ত্রুটিযুক্ত বস্তু নির্ধারণের জন্য কমা ব্যবহার করেছিল। মূল asশব্দটি অ্যাসাইনমেন্টের জন্য ব্যবহৃত হয়। ত্রুটিযুক্ত বস্তুর জন্য আপনি যে কোনও নাম ব্যবহার করতে পারেন, আমি errorব্যক্তিগতভাবে পছন্দ করি ।

ভাল অভ্যাস

পাইথনের সাথে সামঞ্জস্যপূর্ণ পদ্ধতিতে এটি করার জন্য আপনাকে ব্যতিক্রমগুলি কমা দিয়ে আলাদা করতে হবে এবং পূর্বের সিনট্যাক্স থেকে পৃথক করার জন্য তাদের প্রথম বন্ধনীর সাহায্যে আবদ্ধ করতে হবে যা ব্যতিক্রমের নামের সাথে একটি ব্যতিক্রমের নামের সাথে ধরা পড়ার পরে অনুসরণ করতে পারে a কমা।

সাধারণ ব্যবহারের উদাহরণ এখানে:

import sys

try:
    mainstuff()
except (KeyboardInterrupt, EOFError): # the parens are necessary
    sys.exit(0)

আমি বাগগুলি আড়াল করতে এড়াতে কেবল এই ব্যতিক্রমগুলি উল্লেখ করছি, যা যদি আমার মুখোমুখি হয় তবে আমি পুরো স্ট্যাক ট্রেসটি আশা করব।

এটি এখানে নথিভুক্ত করা হয়েছে: https://docs.python.org/tutorial/erferences.html

আপনি কোনও চলকটিতে ব্যতিক্রমটি বরাদ্দ করতে পারেন, ( eসাধারণ তবে আপনি যদি দীর্ঘ ব্যতিক্রম হ্যান্ডলিং করতে থাকেন বা আপনার আইডিই কেবল তার চেয়ে বড় নির্বাচনগুলিকে হাইলাইট করে তবে আপনি আরও ভার্বোস ভেরিয়েবলটি পছন্দ করতে পারেন)) উদাহরণটিতে একটি আরগস বৈশিষ্ট্য রয়েছে। এখানে একটি উদাহরণ:

import sys

try:
    mainstuff()
except (KeyboardInterrupt, EOFError) as err: 
    print(err)
    print(err.args)
    sys.exit(0)

দ্রষ্টব্য যে পাইথন 3 এ, errঅবরুদ্ধকরণটি শেষ হওয়ার পরে অবজেক্টটি সুযোগের বাইরে চলে যায় except

অসমর্থিত

আপনি এমন কোড দেখতে পাচ্ছেন যা কমা দিয়ে ত্রুটিটি নির্ধারণ করে। পাইথন ২.৫ এবং তার আগে পাওয়া একমাত্র ফর্মটি এই ব্যবহারটি অবহিত করা হয়েছে এবং আপনি যদি কোডটি পাইথন 3 তে সামঞ্জস্যপূর্ণ করতে চান তবে নতুন রূপটি ব্যবহার করার জন্য আপনার বাক্য গঠনটি আপডেট করতে হবে:

import sys

try:
    mainstuff()
except (KeyboardInterrupt, EOFError), err: # don't do this in Python 2.6+
    print err
    print err.args
    sys.exit(0)

আপনি যদি আপনার কোডবেসে কমা নামের অ্যাসাইনমেন্টটি দেখেন এবং আপনি পাইথন 2.5 বা ততোধিক ব্যবহার করছেন তবে এটি করার নতুন পদ্ধতিতে স্যুইচ করুন যাতে আপনি আপগ্রেড করার সময় আপনার কোডটি সামঞ্জস্য বজায় থাকে।

suppressপ্রসঙ্গ ব্যবস্থাপক

গৃহীত উত্তরটি সত্যই 4 টি লাইনের কোড, ন্যূনতম:

try:
    do_something()
except (IDontLikeYouException, YouAreBeingMeanException) as e:
    pass

try, except, passলাইনের একটি একক লাইন পরিচালিত করা যেতে পারে দমন প্রসঙ্গে পরিচালক, পাইথন 3.4 পাওয়া :

from contextlib import suppress

with suppress(IDontLikeYouException, YouAreBeingMeanException):
     do_something()

সুতরাং আপনি যখন passকিছু ব্যতিক্রম করতে চান , ব্যবহার করুন suppress


2
ভালো উপরন্তু suppress, অনেক মাত্র করছেন চেয়ে বেশি পাঠযোগ্য passউপরexcept
ম্যাশে

50

পাইথন ডকুমেন্টেশন থেকে -> 8.3 হ্যান্ডলিং ব্যতিক্রম :

একটি tryবিবৃতিতে বিভিন্ন ব্যতিক্রমের জন্য হ্যান্ডলারগুলি নির্দিষ্ট করতে ক্লজ ব্যতীত একাধিক থাকতে পারে। সর্বাধিক একটি হ্যান্ডলার কার্যকর করা হবে। হ্যান্ডলাররা কেবলমাত্র একই চেষ্টা স্টেটমেন্টের অন্যান্য হ্যান্ডলারের ক্ষেত্রে নয়, সংশ্লিষ্ট ট্রায়াল ক্লজে উপস্থিত ব্যতিক্রমগুলি পরিচালনা করে। ক্লজ ব্যতীত কোনও প্যারেনেসাইজড টিপল হিসাবে একাধিক ব্যতিক্রমের নাম দিতে পারে, উদাহরণস্বরূপ:

except (RuntimeError, TypeError, NameError):
    pass

নোট করুন যে এই টিউপলের চারপাশে প্রথম বন্ধনীর প্রয়োজন রয়েছে, কারণ আধুনিক পাইথনের ( ValueError, e:সাধারণত except ValueError as e:নীচে বর্ণিত) হিসাবে সাধারণত লেখার জন্য বাক্য গঠন ব্যবহার করা হয়নি । পুরানো বাক্য গঠনটি এখনও পিছনের সামঞ্জস্যের জন্য সমর্থিত। এর অর্থ except RuntimeError, TypeErrorসমান নয় except (RuntimeError, TypeError):তবে except RuntimeError as TypeError:যা আপনি চান তা নয়।


35

আপনি ঘন ঘন ব্যতিক্রমগুলি যদি ব্যবহার করেন তবে আপনি একটি টিউপলকে প্রাক-সংজ্ঞা দিতে পারেন, তাই আপনাকে এগুলি অনেকবার পুনরায় টাইপ করতে হবে না।

#This example code is a technique I use in a library that connects with websites to gather data

ConnectErrs  = (URLError, SSLError, SocketTimeoutError, BadStatusLine, ConnectionResetError)

def connect(url, data):
    #do connection and return some data
    return(received_data)

def some_function(var_a, var_b, ...):
    try: o = connect(url, data)
    except ConnectErrs as e:
        #do the recovery stuff
    blah #do normal stuff you would do if no exception occurred

মন্তব্য:

  1. আপনারও যদি পূর্বনির্ধারিত টিপলের তুলনায় অন্যান্য ব্যতিক্রমগুলি ধরা দরকার তবে আপনাকে ব্লক ব্যতীত অন্য কোনও সংজ্ঞা দিতে হবে।

  2. আপনি যদি কেবল বৈশ্বিক পরিবর্তনশীল সহ্য করতে না পারেন তবে এটি প্রধান () তে সংজ্ঞায়িত করুন এবং যেখানে প্রয়োজন সেখানে এটি পাস করুন ...


17

এটি করার একটি উপায় হ'ল ..

try:
   You do your operations here;
   ......................
except(Exception1[, Exception2[,...ExceptionN]]]):
   If there is any exception from the given exception list, 
   then execute this block.
   ......................
else:
   If there is no exception then execute this block. 

এবং আরেকটি উপায় হ'ল এমন পদ্ধতি তৈরি করা যা exceptব্লক দ্বারা সম্পাদিত টাস্ক সম্পাদন করে এবং exceptআপনি যে ব্লকটি লিখে থাকেন সেটিকে কল করে ..

try:
   You do your operations here;
   ......................
except Exception1:
    functionname(parameterList)
except Exception2:
    functionname(parameterList)
except Exception3:
    functionname(parameterList)
else:
   If there is no exception then execute this block. 

def functionname( parameters ):
   //your task..
   return [expression]

আমি জানি যে দ্বিতীয়টি এটি করার সর্বোত্তম উপায় নয় তবে আমি এই জিনিসটি করার জন্য বেশ কয়েকটি উপায় দেখিয়ে চলেছি।


আমি দ্বিতীয়টি ব্যবহার করছি কারণ আমার দুটি পৃথক ব্যতিক্রম রয়েছে যে প্রত্যেককে আলাদাভাবে প্রক্রিয়া করা প্রয়োজন। সেভাবে করায় কিছু ভুল আছে?
মজিকমান

@ মজিক্মান যখন আপনি নিজেকে পুনরাবৃত্তি না করার চেষ্টা করছেন এবং দুটি ব্যতিক্রমের জন্য একই জিনিস করছেন তখন একাধিক ধারাগুলির সাথে একই ফাংশনটিতে কল করার দ্বিতীয় পদ্ধতিটি সেরা নয়। (এটি করার সঠিক উপায়ের জন্য অন্যান্য উত্তরগুলি দেখুন)। তবে exceptআপনি যখন ব্যতিক্রমগুলি অন্যরকমভাবে পরিচালনা করতে চান তখন একাধিক ধারা থাকা স্বাভাবিক।
13:29
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.