পাইথন ব্যবহার "থেকে উত্থাপন"


196

পাইথনের মধ্যে raiseএবং পার্থক্য কী raise from?

try:
    raise ValueError
except Exception as e:
    raise IndexError

যা ফলন দেয়

Traceback (most recent call last):
  File "tmp.py", line 2, in <module>
    raise ValueError
ValueError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "tmp.py", line 4, in <module>
    raise IndexError
IndexError

এবং

try:
    raise ValueError
except Exception as e:
    raise IndexError from e

যা ফলন দেয়

Traceback (most recent call last):
  File "tmp.py", line 2, in <module>
    raise ValueError
ValueError

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "tmp.py", line 4, in <module>
    raise IndexError from e
IndexError

9
আপনি পিইপি -3134 পড়েছেন ?
jonrsharpe

4
এখন, ব্যবহার করুন raise IndexError from None
মার্টিজন পিটারস

11
হেহ। raise IndexError from Falseএকটি উত্থাপন, একটি TypeErrorনা IndexError। আমার দিন তৈরি।
ম্যাড পদার্থবিজ্ঞানী


এটি উল্লেখ করার জন্য এটি সঠিক জায়গা কিনা তা নিশ্চিত নন তবে স্পাইডার ব্যবহারকারী যে কারও কাছে: এই সম্পূর্ণ নির্মাণটি সেখানে কাজ করে না। এটি এখন 3 বছরেরও বেশি সময় ধরে একটি সমস্যা হয়ে দাঁড়িয়েছে ( github.com/spyder-ide/spyder/issues/2943 ) তবে তারা মনে করে শৃঙ্খলিত ব্যাতিক্রমের কোনও প্রয়োজন নেই।
এমিল বোদে

উত্তর:


227

পার্থক্যটি হ'ল আপনি যখন ব্যবহার করবেন fromতখন __cause__বৈশিষ্ট্যটি সেট করা হয় এবং বার্তাটি উল্লেখ করে যে ব্যতিক্রমটি সরাসরি কারণে হয়েছিল । আপনি যদি বাদ পড়ে থাকেন fromতবে কোনও __cause__সেট করা নেই, তবে __context__বৈশিষ্ট্যটিও সেট করা যেতে পারে এবং ট্রেসব্যাকটি অন্য কিছু হ্যান্ডল করার সময় প্রসঙ্গটি দেখায় ।

__context__আপনি raiseযদি কোনও ব্যতিক্রম হ্যান্ডলার ব্যবহার করেন তবে সেটিংস নির্ধারণ করা ; আপনি যদি raiseঅন্য কোথাও ব্যবহার করেন __context__তবে সেট করা নেই।

যদি সেট করা থাকে, ব্যতিক্রমের উপর __cause__একটি __suppress_context__ = Trueপতাকাও সেট করা থাকে; কখন __suppress_context__সেট করা থাকে True, __context__কোনও ট্রেসব্যাক মুদ্রণ করার সময় তা উপেক্ষা করা হয়।

আপনি যখন প্রসঙ্গটি প্রদর্শন করতে চান না এমন কোনও ব্যতিক্রম হ্যান্ডলার থেকে উত্থাপন করার সময় ( অন্য কোনও ব্যতিক্রম ঘটেছিল বার্তাটি পরিচালনা করার সময় একটিটি চান না ), তারপরে raise ... from Noneসেট __suppress_context__করতে ব্যবহার করুন True

অন্য কথায়, পাইথন ব্যতিক্রমগুলির জন্য একটি প্রসঙ্গ নির্ধারণ করে যাতে আপনি যেখানে একটি ব্যতিক্রম উত্থাপিত হয়েছিল তার আত্মপরিচয় করতে পারেন, আপনাকে দেখতে দেয় যে আরও একটি ব্যতিক্রম এটি প্রতিস্থাপন করেছে কিনা। আপনি অন্যান্য ব্যতিক্রম সম্পর্কে ট্র্যাসব্যাককে সুস্পষ্ট করে তুলতে কোনও কারণ যুক্ত করতে পারেন (ভিন্ন শব্দ ব্যবহার করুন), এবং প্রসঙ্গটি উপেক্ষা করা হবে (তবে এখনও ডিবাগ করার সময় অন্তর্মুখী হতে পারে)। ব্যবহারটি raise ... from Noneআপনাকে মুদ্রিত হওয়া প্রসঙ্গে দমন করতে দেয়।

দেখুন raiseবিবৃতি documenation :

fromদফা ব্যতিক্রম chaining জন্য ব্যবহার করা হয়: যদি দেওয়া, দ্বিতীয় অভিব্যক্তি অন্য ব্যতিক্রম বর্গ বা দৃষ্টান্ত, যা যেমন উত্থাপিত ব্যতিক্রম সংযুক্ত করা হবে হওয়া আবশ্যক __cause__(যা লিখনযোগ্য) অ্যাট্রিবিউট। যদি উত্থাপিত ব্যতিক্রমটি পরিচালনা না করা হয় তবে উভয় ব্যতিক্রম মুদ্রণ করা হবে:

>>> try:
...     print(1 / 0)
... except Exception as exc:
...     raise RuntimeError("Something bad happened") from exc
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
ZeroDivisionError: int division or modulo by zero

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
RuntimeError: Something bad happened

ব্যতিক্রম হ্যান্ডলার বা একটি finallyধারাটির মধ্যে কোনও ব্যতিক্রম উত্থাপিত হলে অনুরূপ প্রক্রিয়া সুস্পষ্টভাবে কাজ করে : পূর্ববর্তী ব্যতিক্রমটি নতুন ব্যতিক্রমের __context__বৈশিষ্ট্য হিসাবে সংযুক্ত করা হয় :

>>> try:
...     print(1 / 0)
... except:
...     raise RuntimeError("Something bad happened")
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
ZeroDivisionError: int division or modulo by zero

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
RuntimeError: Something bad happened

আরো দেখুন বিল্ট-ইন ব্যতিক্রমসমূহ ডকুমেন্টেশন ব্যতিক্রম সংযুক্ত প্রসঙ্গ এবং কারণ তথ্যের উপর বিস্তারিত জানার জন্য।


11
অন্তর্নিহিতের পরিবর্তে fromএবং __cause__এর পরিবর্তে ব্যতিক্রমগুলি স্পষ্টভাবে শৃঙ্খলার কোনও কারণ আছে কি __context__? এমন কি এমন কোনও মামলা রয়েছে যেখানে কেউ ধরা পড়ার চেয়ে আলাদা ব্যতিক্রম সংযুক্ত করে except?
ডার্কলাইন

13
@ ডারকফলাইন: আসুন বলুন যে আপনার ডাটাবেস এপিআই ওয়েব এবং ডিস্ক সহ বিভিন্ন উত্স থেকে খোলার ডেটাবেস সমর্থন করে। ডাটাবেস খুললে ব্যর্থ হলে আপনার API সর্বদা একটি উত্থাপন করবে DatabaseError। তবে যদি ব্যর্থতা যদি IOErrorকোনও ফাইল খোলার ক্ষেত্রে ব্যর্থ হয় বা HTTPErrorকোনও URL টি কাজ করতে ব্যর্থ হয় তবে এর ফলস্বরূপ আপনি সেই প্রসঙ্গটি স্পষ্টভাবে অন্তর্ভুক্ত করতে চান, সুতরাং API ব্যবহার করে বিকাশকারী এটি কেন ডিবাগ করতে পারে। এই মুহুর্তে আপনি ব্যবহার raise DatabaseError from original_exception
মার্টিজন পিটারস

4
@darkfeline: যে ডেভেলপার তাদের নিজস্ব API এ ডাটাবেসের API ব্যবহার করতে মোড়কে এবং যে পাস চেয়েছিলেন করা হয়, তাহলে IOErrorবা HTTPErrorউপর তাদের ভোক্তাদের, তারপর তারা ব্যবহার করতে হবে চাই raise NewException from databaseexception.__cause__, এখন থেকে কোনো আলাদা ব্যতিক্রম ব্যবহার DatabaseExceptionকরে তারা শুধু ধরা।
মার্টিজন পিটারস

2
@ ড্যান 3: না, নেই। ব্যতিক্রম শৃঙ্খলা বিশুদ্ধভাবে একটি পাইথন 3 বৈশিষ্ট্য।
মার্টিজন পিটারস

5
@ লাইক 9 মি: আপনি যখন ব্যতিক্রম পরিচালনা করছেন তখন আপনি কী বোঝাতে চাইছেন fooএবং কোনও নতুন ব্যতিক্রম বাড়াতে চান bar? তারপরে আপনি raise bar from fooপাইথন রাজ্যটি foo সরাসরিbar ব্যবহার করতে পারেন এবং তা পেতে পারেন । আপনি যদি না ব্যবহার from foo, তারপর পাইথন এখনও উভয় প্রিন্ট হবে, কিন্তু বলে যে সময় হ্যান্ডলিং foo, barউত্থাপিত হয়েছিল , ভিন্ন বার্তা, ত্রুটি পরিচালনা একটি সম্ভাব্য বাগ পতাকা উদ্দেশ্যে।
মার্টিজন পিটারস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.