কর্মক্ষেত্রে, আমি except
একটি or
অপারেটরের সাথে একটি ধারাতে হোঁচট খেয়েছি:
try:
# Do something.
except IndexError or KeyError:
# ErrorHandling
আমি জানি যে ব্যতিক্রম ক্লাসগুলি একটি টিউপল হিসাবে পাস করা উচিত, তবে এটি আমাকে তাগিদে দেয় যে এটি এমনকি একটির কারণও হয় না SyntaxError
।
সুতরাং প্রথমে আমি অনুসন্ধান করতে চেয়েছিলাম এটি আসলে কাজ করে কিনা। এবং এটা না।
>>> def with_or_raise(exc):
... try:
... raise exc()
... except IndexError or KeyError:
... print('Got ya!')
...
>>> with_or_raise(IndexError)
Got ya!
>>> with_or_raise(KeyError)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in with_or_raise
KeyError
সুতরাং এটি দ্বিতীয় ব্যতিক্রমটি ধরেনি, এবং বাইটকোডের দিকে তাকালে এটি স্পষ্ট হয়ে যায় কেন:
>>> import dis
>>> dis.dis(with_or_raise)
2 0 SETUP_EXCEPT 10 (to 12)
3 2 LOAD_FAST 0 (exc)
4 CALL_FUNCTION 0
6 RAISE_VARARGS 1
8 POP_BLOCK
10 JUMP_FORWARD 32 (to 44)
4 >> 12 DUP_TOP
14 LOAD_GLOBAL 0 (IndexError)
16 JUMP_IF_TRUE_OR_POP 20
18 LOAD_GLOBAL 1 (KeyError)
>> 20 COMPARE_OP 10 (exception match)
22 POP_JUMP_IF_FALSE 42
24 POP_TOP
26 POP_TOP
28 POP_TOP
5 30 LOAD_GLOBAL 2 (print)
32 LOAD_CONST 1 ('Got ya!')
34 CALL_FUNCTION 1
36 POP_TOP
38 POP_EXCEPT
40 JUMP_FORWARD 2 (to 44)
>> 42 END_FINALLY
>> 44 LOAD_CONST 0 (None)
46 RETURN_VALUE
সুতরাং আমরা দেখতে পাচ্ছি, নির্দেশ 14 প্রথম ক্লাসটিকে IndexError
স্ট্যাকের উপর চাপিয়ে দেয় । তারপরে এটি পরীক্ষা করে যে সেই মানটি কিনা True
এটি পাইথনের সত্যতার কারণে এবং অবশেষে যেখানে সরাসরি exception match
সম্পন্ন হয় সেখানে নির্দেশের দিকে ঝাঁপিয়ে পড়ে 20 যেহেতু 18 টি নির্দেশনা এড়িয়ে গেছে, KeyError
কখনও স্ট্যাকের উপর চাপানো হয়নি এবং সে কারণে এটি মেলে না।
আমি পাইথন ২.7 এবং ৩.6 একই ফলাফল দিয়ে চেষ্টা করেছি।
তবে, কেন এটি বৈধ সিনট্যাক্স? আমি এটি নিম্নলিখিতগুলির মধ্যে একটি বলে ধারণা করছি:
- এটি পাইথনের সত্যই পুরানো সংস্করণ থেকে প্রাপ্ত একটি নিদর্শন।
or
একটিexcept
ধারা মধ্যে ব্যবহার করার জন্য একটি বৈধ ব্যবহারের কেস আছে ।- এটি কেবল পাইথন পার্সারের একটি সীমাবদ্ধতা যা
except
কীওয়ার্ডের পরে কোনও অভিব্যক্তি গ্রহণ করতে পারে ।
আমার ভোট 3 এ আছে (প্রদত্ত আমি পাইথনের নতুন পার্সার সম্পর্কে কিছু আলোচনা দেখেছি) তবে আমি আশা করছি যে কেউ এই অনুমানটি নিশ্চিত করতে পারে। কারণ এটি উদাহরণস্বরূপ 2 হলে, আমি সেই ব্যবহারের ক্ষেত্রেটি জানতে চাই!
এছাড়াও, আমি কীভাবে এই অন্বেষণ চালিয়ে যেতে পারি সে সম্পর্কে আমি কিছুটা নিখুঁত। আমি ভাবছি আমাকে সিপিথন পার্সারের উত্স কোডটি খনন করতে হবে তবে আইডিকে কোথায় এটি পাওয়া যাবে এবং সম্ভবত এর থেকে সহজ উপায় আছে?