কীভাবে ব্যতিক্রমগুলি সঠিকভাবে উপেক্ষা করবেন


776

আপনি যখন কেবল ব্যতিক্রমটি পরিচালনা না করেই চেষ্টা করতে চান, আপনি পাইথনে এটি কীভাবে করবেন?

নিম্নলিখিতটি কি এটি করার সঠিক উপায়?

try:
    shutil.rmtree(path)
except:
    pass

10
অদ্ভুত যে কেউ এখনও অবধি এটি উল্লেখ করেনি (আমি আমার জবাব দিয়েছি), তবে এই নির্দিষ্ট ফাংশনের জন্য আপনি কেবল তা করতে পারেন shutil.rmtree(path, ignore_errors=True)। তবে এটি বেশিরভাগ ফাংশনের জন্য প্রযোজ্য হবে না।
হারুন হলের

9
ব্যতিক্রমগুলি উপেক্ষা করার বিষয়ে চিন্তা করার সময় গুরুত্বপূর্ণ পঠন: কেন "ব্যতীত: পাস" একটি খারাপ প্রোগ্রামিং অনুশীলন?
অকর্মা

3
বাস্তব জীবনে এটি করার কথা ভাবুন। চেষ্টা করুন: get_cash ('$ 1000') ব্যতীত: পাস # মেহ, এটি সম্ভবত ঠিক থাকবে
গ্রোকোডিল

উত্তর:


1039
try:
    doSomething()
except: 
    pass

অথবা

try:
    doSomething()
except Exception: 
    pass

পার্থক্য হল যে প্রথম এক এছাড়াও ধরতে হবে KeyboardInterrupt, SystemExitএবং যে ভালো জিনিস, যা সরাসরি থেকে উদ্ভূত হয় exceptions.BaseException, না exceptions.Exception

বিশদ জন্য ডকুমেন্টেশন দেখুন:


4
নোট করুন যে স্টিপএটারেশন এবং সতর্কতা উভয়ই ব্যতিক্রম থেকে উত্তরাধিকার সূত্রে প্রাপ্ত। আপনার প্রয়োজনের উপর নির্ভর করে আপনি এর পরিবর্তে স্ট্যান্ডার্ডেরর থেকে উত্তরাধিকারী হতে পারেন।
বেন ফাঁকা

1
এটি সত্য, তবে আপনি যদি সাবধান না হন তবে আপনি সূক্ষ্ম বাগগুলিতে দৌড়াতে পারেন (বিশেষত যদি আপনি স্টপআইটারেশন পাস করার পরিবর্তে অন্য কিছু করছেন)।
জেসন বেকার

17
-1, try: shuti.rmtree(...) except: passcrudely কোনো ত্রুটি দমন পাবেন (এমনকি যদি আপনি বানান ভুল shutilএকটি ফলে NameError) - অন্ততপক্ষে না এexcept OSError:
dbr

43
এই উত্তরটি তথ্যবহুল হলেও, একটি গুরুত্বপূর্ণ তথ্য অনুপস্থিত - আপনার কখনও এই ব্যতিক্রমটি ধরা উচিত নয়। পরিবর্তে, আপনার যত্ন নেওয়া কেবলমাত্র ব্যতিক্রমগুলি সর্বদা চেষ্টা করার চেষ্টা করা উচিত, অন্যথায় তুচ্ছ বাগগুলি শিকার করার সময় আপনার দুঃস্বপ্ন হবে, আপনার জেনেরিক "এস" ব্যতীত লুকিয়ে রাখবেন। আরও তথ্যের জন্য ডিবিআরের উত্তর দেখুন। (আমি জানি এটি আসল প্রশ্ন ছিল না - তবে যে কেউ এটির সন্ধান করছেন তিনি আপনার স্নিপেটটি নেবেন এবং এটি যেমনটি ব্যবহার করবেন)
জোহানোদো

139

আপনার আগ্রহী ত্রুটিগুলি কেবলমাত্র ধরা এটি সাধারণত সেরা অনুশীলন হিসাবে বিবেচিত হয় shutil.rmtreeit's সম্ভবত এর ক্ষেত্রে OSError:

>>> shutil.rmtree("/fake/dir")
Traceback (most recent call last):
    [...]
OSError: [Errno 2] No such file or directory: '/fake/dir'

আপনি যদি চুপচাপ সেই ত্রুটিটিকে উপেক্ষা করতে চান তবে আপনি তা করবেন:

try:
    shutil.rmtree(path)
except OSError:
    pass

কেন? আপনি বলুন (কোনওভাবে) দুর্ঘটনাবশত ফাংশনটিকে স্ট্রিংয়ের পরিবর্তে একটি পূর্ণসংখ্যা পাস করুন, যেমন:

shutil.rmtree(2)

এটি ত্রুটিটি দেবে "টাইপ এয়ারার: ​​ইউনিকোডে জোর করানো: স্ট্রিং বা বাফার দরকার, ইনট পাওয়া গেছে" - আপনি সম্ভবত এটিকে অগ্রাহ্য করতে চান না, যা ডিবাগ করা কঠিন can

আপনি যদি অবশ্যই সমস্ত ত্রুটি উপেক্ষা করতে চান তবে Exceptionখালি except:বিবৃতি না দিয়ে ধরুন । আবার কেন?

একটি ব্যতিক্রম নির্দিষ্ট না করে প্রতিটি ব্যতিক্রম ধরা পড়ে , যেমন SystemExitব্যতিক্রমগুলি উদাহরণস্বরূপ sys.exit()ব্যবহার করে:

>>> try:
...     sys.exit(1)
... except:
...     pass
... 
>>>

এটি নীচের সাথে তুলনা করুন, যা সঠিকভাবে উপস্থিত:

>>> try:
...     sys.exit(1)
... except Exception:
...     pass
... 
shell:~$ 

আপনি যদি আরও ভাল আচরণের কোডটি লিখতে চান তবে OSErrorব্যতিক্রমটি বিভিন্ন ত্রুটি উপস্থাপন করতে পারে তবে উপরের উদাহরণে আমরা কেবল উপেক্ষা করতে চাই Errno 2তাই আমরা আরও নির্দিষ্ট হতে পারি:

import errno

try:
    shutil.rmtree(path)
except OSError as e:
    if e.errno != errno.ENOENT:
        # ignore "No such file or directory", but re-raise other errors
        raise

1
shutil.rmtreeসর্বোত্তম উদাহরণ নয়, কারণ আপনি কেবল ignore_errors=Trueসেই ফাংশনটির জন্য ব্যবহার করবেন ..
উইম

113

আপনি যখন ব্যতিক্রমটি পরিচালনা না করে কেবল একবার চেষ্টা করতে চান, পাইথনে আপনি কীভাবে এটি করেন?

এটি "পরিচালনা করা" দ্বারা আপনি কী বোঝাতে চান তার উপর নির্ভর করে।

আপনি যদি কোনও পদক্ষেপ না নিয়ে এটিকে ধরার অর্থ যদি করেন তবে আপনার পোস্ট করা কোডটি কার্যকর হবে।

যদি আপনি বোঝাতে চান যে আপনি ব্যতিক্রমটিকে স্ট্যাকের উপরে যাওয়া বন্ধ না করেই কোনও ব্যতিক্রমের বিরুদ্ধে পদক্ষেপ নিতে চান, তবে আপনি এই জাতীয় কিছু চান:

try:
    do_something()
except:
    handle_exception()
    raise  #re-raise the exact same exception that was thrown

88

প্রথমে আমি এই থ্রেড থেকে জ্যাক ওউ কননারের উত্তর উদ্ধৃত করছি । রেফারেন্সড থ্রেডটি বন্ধ হয়ে গেছে তাই আমি এখানে লিখছি:

"পাইথন ৩.৪-এ এটি করার একটি নতুন উপায় রয়েছে:

from contextlib import suppress

with suppress(Exception):
    # your code

এখানে যে প্রতিশ্রুতি যুক্ত করা হয়েছে তা এখানে রয়েছে: http://hg.python.org/cpython/rev/406b47c64480

এবং এখানে লেখক, রেমন্ড হেটিংগার এই এবং অন্যান্য পাইথনের হটনেস সম্পর্কে কথা বলছেন: https://youtu.be/OSGv2VnC0go?t=43m23s

এটিতে আমার যোগটি পাইথন ২.7 সমতুল্য:

from contextlib import contextmanager

@contextmanager
def ignored(*exceptions):
    try:
        yield
    except exceptions:
        pass

তারপরে আপনি এটি পাইথন ৩.৪-এর মতো ব্যবহার করুন:

with ignored(Exception):
    # your code

55

সম্পূর্ণতার জন্য:

>>> def divide(x, y):
...     try:
...         result = x / y
...     except ZeroDivisionError:
...         print("division by zero!")
...     else:
...         print("result is", result)
...     finally:
...         print("executing finally clause")

এছাড়াও মনে রাখবেন যে আপনি ব্যতিক্রমগুলি এটি ক্যাপচার করতে পারেন:

>>> try:
...     this_fails()
... except ZeroDivisionError as err:
...     print("Handling run-time error:", err)

... এবং এইভাবে ব্যতিক্রমটি আবার উত্থাপন করুন:

>>> try:
...     raise NameError('HiThere')
... except NameError:
...     print('An exception flew by!')
...     raise

... পাইথন টিউটোরিয়াল থেকে উদাহরণ ।


43

কীভাবে সঠিকভাবে ব্যতিক্রম উপেক্ষা করবেন?

এই কাজ করার বিভিন্ন উপায় আছে।

যাইহোক, উদাহরণস্বরূপ নির্বাচনের একটি সাধারণ সমাধান রয়েছে যা সাধারণ ক্ষেত্রে কভার করে না।

উদাহরণে নির্দিষ্ট:

পরিবর্তে

try:
    shutil.rmtree(path)
except:
    pass

এটা কর:

shutil.rmtree(path, ignore_errors=True)

এটি নির্দিষ্ট যুক্তি shutil.rmtree। নিম্নলিখিত কাজগুলি করে আপনি এতে সহায়তা দেখতে পারেন এবং আপনি দেখতে পাবেন এটি ত্রুটিগুলির জন্য কার্যকারিতাও মঞ্জুর করতে পারে।

>>> import shutil
>>> help(shutil.rmtree)

যেহেতু এটি কেবল উদাহরণের সংকীর্ণ কেসটিকেই কভার করে, তাই আমি কী কীভাবে এটি পরিচালনা করব সেগুলি আরও প্রদর্শন করব যদি এই কীওয়ার্ড যুক্তি উপস্থিত না থাকে।

সাধারণ পদ্ধতির

যেহেতু উপরেরটি কেবল উদাহরণের সংকীর্ণ ক্ষেত্রে আবরণ করে, আমি কীভাবে কীভাবে এটি পরিচালনা করব সেগুলি আরও প্রদর্শন করব যদি এই কীওয়ার্ড যুক্তি উপস্থিত না থাকে।

পাইথন ৩.৪-তে নতুন:

আপনি suppressপ্রসঙ্গ পরিচালকটি আমদানি করতে পারেন :

from contextlib import suppress

তবে কেবল সুনির্দিষ্ট ব্যতিক্রমকে দমন করুন:

with suppress(FileNotFoundError):
    shutil.rmtree(path)

আপনি নিঃশব্দে এটিকে উপেক্ষা করবেন FileNotFoundError:

>>> with suppress(FileNotFoundError):
...     shutil.rmtree('bajkjbkdlsjfljsf')
... 
>>> 

ডক্স থেকে :

সম্পূর্ণরূপে ব্যতিক্রমকে দমন করে এমন অন্য কোনও প্রক্রিয়াটির মতো, এই প্রসঙ্গের পরিচালকটি কেবলমাত্র খুব নির্দিষ্ট ত্রুটিগুলি আবরণ করার জন্য ব্যবহার করা উচিত যেখানে প্রোগ্রাম নির্বাহের সাথে নিঃশব্দে চালিয়ে যাওয়া সঠিক জিনিস হিসাবে পরিচিত।

নোট করুন suppressএবং FileNotFoundErrorকেবল পাইথন 3 এ উপলব্ধ।

আপনি যদি নিজের কোডটি পাইথন 2 তে কাজ করতে চান তবে পরবর্তী বিভাগটি দেখুন:

পাইথন 2 এবং 3:

যখন আপনি কেবল ব্যতিক্রম পরিচালনা না করেই চেষ্টা / করতে চান, আপনি পাইথনে এটি কীভাবে করবেন?

নিম্নলিখিতটি কি এটি করার সঠিক উপায়?

try :
    shutil.rmtree ( path )
except :
    pass

পাইথন 2 সামঞ্জস্যপূর্ণ কোডের জন্য, passকোনও বিবৃতি নেই এমন বিবৃতি দেওয়ার সঠিক উপায়। কিন্তু আপনি যখন একটি খালি না except:, যে কি করছেন হিসাবে একই except BaseException:যার মধ্যে GeneratorExit, KeyboardInterruptএবং SystemExitএবং সাধারণ, আপনি সেগুলো ধরা চাই না।

প্রকৃতপক্ষে, আপনি যতটা পারেন ব্যতিক্রমটির নামকরণের ক্ষেত্রে সুনির্দিষ্ট হওয়া উচিত।

পাইথনের (2) ব্যতিক্রম শ্রেণিবিন্যাসের অংশ এখানে রয়েছে এবং আপনি দেখতে পাচ্ছেন যে আপনি যদি আরও সাধারণ ব্যতিক্রমগুলি ধরেন তবে আপনি যে সমস্যাগুলি প্রত্যাশা করেছিলেন তা আড়াল করতে পারেন:

BaseException
 +-- SystemExit
 +-- KeyboardInterrupt
 +-- GeneratorExit
 +-- Exception
      +-- StopIteration
      +-- StandardError
      |    +-- BufferError
      |    +-- ArithmeticError
      |    |    +-- FloatingPointError
      |    |    +-- OverflowError
      |    |    +-- ZeroDivisionError
      |    +-- AssertionError
      |    +-- AttributeError
      |    +-- EnvironmentError
      |    |    +-- IOError
      |    |    +-- OSError
      |    |         +-- WindowsError (Windows)
      |    |         +-- VMSError (VMS)
      |    +-- EOFError
... and so on

আপনি সম্ভবত এখানে একটি ওএসআরর ধরতে চান, এবং কোনও ডিরেক্টরি নেই তবে সম্ভবত আপনি যে ব্যতিক্রমটি পাত্তা দিচ্ছেন না তা হ'ল।

আমরা পেতে পারেন যে থেকে নির্দিষ্ট ত্রুটিপূর্ণ সংখ্যা errnoযদি আমরা যে হবে না গ্রন্থাগার, এবং reraise:

import errno

try:
    shutil.rmtree(path)
except OSError as error:
    if error.errno == errno.ENOENT: # no such file or directory
        pass
    else: # we had an OSError we didn't expect, so reraise it
        raise 

দ্রষ্টব্য, একটি খালি উত্থাপন মূল ব্যতিক্রম উত্থাপন করে, যা সম্ভবত এই ক্ষেত্রে আপনি চান। আরও সংক্ষিপ্তভাবে লিখিত, যেহেতু passব্যতিক্রম হ্যান্ডলিংয়ে আমাদের কোড সহ স্পষ্টভাবে প্রয়োজন হয় না :

try:
    shutil.rmtree(path)
except OSError as error:
    if error.errno != errno.ENOENT: # no such file or directory
        raise 

11

আপনি যখন ব্যতিক্রমটি পরিচালনা না করে কেবল একবার চেষ্টা করতে চান, পাইথনে আপনি কীভাবে এটি করেন?

এটি আপনাকে ব্যতিক্রমটি কী তা মুদ্রণ করতে সহায়তা করবে :( অর্থাত ব্যতিক্রম না পরিচালনা করে ধরতে চেষ্টা করুন এবং ব্যতিক্রমটি মুদ্রণ করুন))

import sys
try:
    doSomething()
except:
    print "Unexpected error:", sys.exc_info()[0]

10
try:
      doSomething()
except Exception: 
    pass
else:
      stuffDoneIf()
      TryClauseSucceeds()

এফওয়াইআইআই অন্য ধারাটি সমস্ত ব্যতিক্রমের পরে যেতে পারে এবং চেষ্টা করা কোডটি যদি ব্যতিক্রম না ঘটায় তবেই তা চালানো যেতে পারে।


1
অবশেষে elseএই প্রসঙ্গে একটি ভাল ব্যাখ্যা । এবং এটি যুক্ত finallyকরতে সর্বদা যে কোনও (বা ব্যতিক্রম নয়) এর পরে চলবে।
not2qubit

5

আমার একাধিক আদেশে ত্রুটি উপেক্ষা করার দরকার ছিল এবং ফাকিটি কৌশলটি করেছে did

import fuckit

@fuckit
def helper():
    print('before')
    1/0
    print('after1')
    1/0
    print('after2')

helper()

+1 কারণ আপনি অবশ্যই আমার দিনটি তৈরি করেছেন কারণ এই উত্স কোডের অভ্যন্তরে আপনি লাইভ স্ট্যাক সংশোধন করার মতো কয়েকটি অত্যন্ত দরকারী জিনিস শিখতে পারেন
ডাব্লুবিআর

3

পাইথনে, আমরা অন্যান্য ভাষার মতোই ব্যতিক্রমগুলি পরিচালনা করি তবে পার্থক্যটি কিছু বাক্য গঠন পার্থক্য, উদাহরণস্বরূপ,

try:
    #Your code in which exception can occur
except <here we can put in a particular exception name>:
    # We can call that exception here also, like ZeroDivisionError()
    # now your code
# We can put in a finally block also
finally:
    # Your code...

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.