এই টিউটোৰিয়েলে প্ৰগ্ৰামিং উদাহৰণৰ সহায়ত Try Except ব্লক ব্যৱহাৰ কৰি পাইথনত ব্যতিক্ৰম নিয়ন্ত্ৰণ ব্যাখ্যা কৰে:
দুটা ভুল প্ৰকাৰে এটা পাইথন প্ৰগ্ৰাম হঠাতে বন্ধ কৰিব পাৰে অৰ্থাৎ বাক্যবিন্যাস ভুল , আৰু ব্যতিক্ৰম । এই টিউটোৰিয়েলত আমি কেইবাটাও গুৰুত্বপূৰ্ণ বিষয়ৰ অধীনত দ্বিতীয় ভুলৰ ধৰণ (Exceptions) আলোচনা কৰিম।
আমাৰ এপ্লিকেচনত ব্যতিক্ৰম নিয়ন্ত্ৰণ কৰিলে আমি বহুত উপকৃত হম যেনে:
- এটা শক্তিশালী এপ্লিকেচন সৃষ্টি কৰা।
- এটা পৰিষ্কাৰ আৰু ভুল-মুক্ত ক'ড সৃষ্টি কৰা।
পাইথন চেষ্টা কৰক বাদে
এটা ভাল খবৰ হ'ল যে পাইথনত আমাৰ ক'ডত ভুল ধৰিবলৈ ভাল সংখ্যক বিল্ট-ইন ব্যতিক্ৰম আছে। লগতে, ই আমাক কাষ্টম ব্যতিক্ৰম সৃষ্টি কৰাৰ সুযোগ দিয়ে যেতিয়া কোনো এটা বিল্ট-ইন ব্যতিক্ৰম আমাৰ প্ৰয়োজন অনুসৰি নহয়।
এটা ব্যতিক্ৰম কি
গতিকে পাইথনত এটা ব্যতিক্ৰম কি? বাৰু, সহজ ভাষাত ক'বলৈ গ'লে, যেতিয়াই পাইথন ইন্টাৰপ্ৰেটাৰে অবৈধ ক'ড এক্সিকিউট কৰিবলৈ চেষ্টা কৰে, ই এটা ব্যতিক্ৰম উত্থাপন কৰে, আৰু যিবোৰ ক্ষেত্ৰত এনে ব্যতিক্ৰম নিয়ন্ত্ৰণ কৰা নহয়, ই প্ৰগ্ৰামৰ নিৰ্দেশনাৰ সাধাৰণ প্ৰবাহত ব্যাঘাত জন্মায় আৰু এটা ট্ৰেচবেক প্ৰিন্ট কৰে।
এটা অবৈধ ক'ড সৃষ্টি কৰোঁ আহক আৰু পাইথন ইন্টাৰপ্ৰেটাৰে কেনেকৈ সঁহাৰি দিব চাওঁ।
এটা পাইথন শ্বেল খোলক আৰু নিম্নলিখিত ক'ড চলাওক।
>>> 50/0
এইটো এটা প্ৰগ্ৰেমিংৰ আটাইতকৈ সাধাৰণ ভুল। ওপৰৰ ক'ডে 50 সংখ্যাটোক 0 (শূন্য) ৰে ভাগ কৰিবলৈ চেষ্টা কৰে। পাইথন openFile চলক ইয়াক নিযুক্ত কৰাৰ আগতে।
ইয়াত এটা সৰু কৌশল হৈছে finally-block ৰ ভিতৰত ব্যতিক্ৰম নিয়ন্ত্ৰক ব্যৱহাৰ কৰা।
def readFile(file_path): try: openFile = open(file_path,'r') # Open a file as read-only print(openFile.readline()) # Read first line of file content except FileNotFoundError as ex: print(ex) finally: try: print("Cleaning...") openFile.close() except: # catches all exceptions pass # Ignore this error because we don't care. if __name__ == '__main__': filePath = './text.txt' readFile(filePath)
যদি আমাৰ ট্ৰাই-ব্লকে FileNotFoundError উত্থাপন কৰে, তেন্তে আমাৰ নিম্নলিখিত আউটপুট থাকিব
ব্যতিক্ৰম উত্থাপন
পাইথন ব্যতিক্ৰমৰ বিষয়ে এটা ভাল খবৰ হ'ল আমি ইচ্ছাকৃতভাৱে কৰিব পাৰো সিহঁতক ডাঙৰ কৰক। ব্যতিক্ৰমসমূহ raise বিবৃতি ৰ সৈতে উত্থাপন কৰা হয়।
raise বিবৃতিৰ নিম্নলিখিত বাক্যবিন্যাস আছে:
raise [ExceptionName[(*args: Object)]]
এটা টাৰ্মিনেল খোলক আৰু যিকোনো ব্যতিক্ৰম বস্তুৰ পৰা উত্থাপন কৰক পাইথন ইন-বিল্ট ব্যতিক্ৰমসমূহ। উদাহৰণস্বৰূপে, যদি আমি ZeroDivisionError উত্থাপন কৰো:
>>> raise ZeroDivisionError("Can't divide by zero")
আমি ট্ৰেচবেক পাম:
গতিকে, ব্যতিক্ৰম উত্থাপন কৰাটো কিয় গুৰুত্বপূৰ্ণ?
- স্বনিৰ্বাচিত ব্যতিক্ৰমৰ সৈতে কাম কৰাৰ সময়ত।
- চেনিটি পৰীক্ষাৰ সময়ত।
স্বনিৰ্বাচিত ব্যতিক্ৰম শ্ৰেণীসমূহ
এটা স্বনিৰ্বাচিত ব্যতিক্ৰম হৈছে যিটো আপুনি আপোনাৰ প্ৰয়োজনৰ বাবে নিৰ্দিষ্ট ভুলসমূহ নিয়ন্ত্ৰণ কৰিবলে সৃষ্টি কৰে। ট্ৰিকটো হ'ল, আমি এটা ক্লাছ সংজ্ঞায়িত কৰো যিটো বস্তু Exception ৰ পৰা উৎপন্ন হয়, তাৰ পিছত আমি আমাৰ ব্যতিক্ৰম ক্লাছ উত্থাপন কৰিবলৈ raise ষ্টেটমেন্ট ব্যৱহাৰ কৰো।
ধৰি লওক আমি ব্যৱহাৰকাৰীৰ ইনপুট পৰীক্ষা কৰিব বিচাৰো আৰু নিশ্চিত কৰিব বিচাৰো ইনপুট মান ঋণাত্মক নহয়(চেনিটি পৰীক্ষা)। অৱশ্যেই, আমি পাইথন ব্যতিক্ৰম ValueError উত্থাপন কৰিব পাৰো কিন্তু আমি ভুলটোক এটা নিৰ্দিষ্ট আৰু স্ব-ব্যাখ্যামূলক নাম দি কাষ্টমাইজ কৰিব বিচাৰিম যেনে InputIsNegativeError । কিন্তু এই ব্যতিক্ৰমটো পাইথন ইন-বিল্ট নহয়Exception.
গতিকে প্ৰথমে, আমি আমাৰ বেচ ক্লাছ সৃষ্টি কৰোঁ যিটো Exception ৰ পৰা উৎপন্ন হ'ব।
class CustomError(Exception): "Base class exception for all exceptions of this module" pass
তাৰ পিছত আমি আমাৰ exception ক্লাছ সৃষ্টি কৰোঁ যিয়ে বেচ ক্লাছটো উত্তৰাধিকাৰী হ'ব আৰু আমাৰ নিৰ্দিষ্ট ভুলটো নিয়ন্ত্ৰণ কৰিব।
class InputIsNegativeError(CustomError): """Raised when User enters a negative value""" pass
এইটো পৰীক্ষা কৰোঁ
try: value = int(input()) if value 0: raise InputIsNegativeError # Raise exception if value is negative except InputIsNegativeError: # catch and handle exception print("Input value shouldn't be negative")
ব্যৱহাৰকাৰীৰ ইনপুটৰ বাবে ওপৰৰ ক'ড অনুৰোধ, আৰু ই ঋণাত্মক নেকি পৰীক্ষা কৰোঁ। যদি সঁচা, ই আমাৰ স্বনিৰ্বাচিত ব্যতিক্ৰম InputIsNegativeError উত্থাপন কৰে যি পিছত except-statement ত ধৰা পৰে।
তলত সম্পূৰ্ণ ক'ড দিয়া হৈছে:
class CustomError(Exception): "Base class exception for all exceptions of this module" pass class InputIsNegativeError(CustomError): """Raised when User enters a negative value""" pass if __name__ == '__main__': try: value = int(input("Input a number: ")) if value 0: raise InputIsNegativeError # Raise exception if value is negative except InputIsNegativeError: # catch and handle exception print("Input value shouldn't be negative")
যদি ইনপুট মান -1 ৰ দৰে এটা ঋণাত্মক সংখ্যা, তেতিয়া আমাৰ হাতত আউটপুট থাকিব:
পাইথন স্বনিৰ্বাচিত ব্যতিক্ৰমসমূহৰ বিষয়ে অধিক বিৱৰণৰ বাবে পাইথন ডক পৰীক্ষা কৰক।
সঘনাই সোধা প্ৰশ্নসমূহ
প্ৰশ্ন #1) পাইথনে এটা ব্যতিক্ৰম কেনেকৈ নিয়ন্ত্ৰণ কৰে?
উত্তৰ: পাইথনে ব্যৱহাৰ কৰি ব্যতিক্ৰমসমূহ নিয়ন্ত্ৰণ কৰে try-except বিবৃতি । এটা ব্যতিক্ৰম উত্থাপন কৰিব পৰা ক'ডক try block ত ৰখা হয় আৰু এক্সিকিউট কৰা হয় যেতিয়া except block এ ক'ড ৰাখে যি ব্যতিক্ৰমসমূহ নিয়ন্ত্ৰণ কৰিব যদি কোনো উত্থাপন হয়।
১>প্ৰশ্ন #২) পাইথনত ব্যতিক্ৰম কি?
উত্তৰ: যেতিয়াই পাইথন দোভাষীয়ে এটা অবৈধ ক'ডৰ সন্মুখীন হয়, তেতিয়াই ই এটা ব্যতিক্ৰম উত্থাপন কৰে, যিটো পাইথনৰ নিজৰ পদ্ধতি আমাক ক’বলৈ যে কিবা এটা অভাৱনীয় ঘটিল। আমি ইচ্ছাকৃতভাৱে raise বিবৃতি ব্যৱহাৰ কৰি ব্যতিক্ৰম উত্থাপন কৰিব পাৰো।
প্ৰশ্ন #3) পাইথনে একাধিক ব্যতিক্ৰম কেনেকৈ নিয়ন্ত্ৰণ কৰে?
উত্তৰ: পাইথনে একাধিক ব্যতিক্ৰম নিয়ন্ত্ৰণ কৰেএটা ব্লকৰ বাহিৰে এটা বা ব্লকৰ বাহিৰে একাধিক ব্যৱহাৰ কৰি।
এটা ব্লকৰ বাবে, ব্যতিক্ৰমসমূহক এটা টুপল হিচাপে পাছ কৰা হয়: except (Exception1, Exception2,..,ExceptionN) আৰু পাইথন পৰীক্ষাসমূহ সোঁফালৰ পৰা বাওঁফালে মেচৰ বাবে। এই ক্ষেত্ৰত, প্ৰতিটো ব্যতিক্ৰমৰ বাবে একে ব্যৱস্থা লোৱা হয়।
সকলো ব্যতিক্ৰম ধৰাৰ আন এটা উপায় হ'ল except মূল শব্দৰ পিছত ব্যতিক্ৰমৰ নাম এৰি দিয়া।
except: # handle all exceptions here
দ্বিতীয় উপায় হ'ল প্ৰতিটো ব্যতিক্ৰমৰ বাবে এটা ব্যতিক্ৰম ব্লক ব্যৱহাৰ কৰিবলে:
except Exception1: # code to handle Exception1 goes here except Exception2: # code to handle Exception2 goes here except ExceptionN: # code to handle ExceptionN goes here
এই ধৰণে, আপুনি প্ৰতিটো ব্যতিক্ৰমৰ বাবে পৃথক পদক্ষেপ ল'ব পাৰে।
প্ৰশ্ন #4) পাইথনত ব্যতিক্ৰম নিয়ন্ত্ৰণ কিয় গুৰুত্বপূৰ্ণ?
উত্তৰ: পাইথনত ব্যতিক্ৰম নিয়ন্ত্ৰণ কৰাৰ সুবিধাটো হ'ল আমি শক্তিশালী, পৰিষ্কাৰ আৰু ভুলমুক্ত এপ্লিকেচন সৃষ্টি কৰিব পাৰো। আমি কিছুমান ভুলৰ বাবে আমাৰ প্ৰডাকচন ক'ড ক্ৰেচ হোৱাটো নিবিচাৰো, গতিকে আমি ভুলসমূহ নিয়ন্ত্ৰণ কৰো আৰু আমাৰ এপ্লিকেচনটো চলাই ৰাখোঁ।
প্ৰশ্ন #5) আপুনি পাইথনত এটা ব্যতিক্ৰম কেনেকৈ আওকাণ কৰে?
উত্তৰ: পাইথনত এটা ব্যতিক্ৰম আওকাণ কৰিবলৈ, except ব্লকত pass চাবিশব্দ ব্যৱহাৰ কৰক। ধৰি লওক আমি ValueError ব্যতিক্ৰমক আওকাণ কৰিব বিচাৰো। আমি এইদৰে কৰিম:
except ValueError: pass
যদিহে আপুনি কি কৰি আছে নাজানে, ব্যতিক্ৰমক আওকাণ কৰাটো বেয়া অভ্যাস। অন্ততঃ, ব্যৱহাৰকাৰীক সকলো সম্ভাৱ্য ভুলৰ বিষয়ে জনাওক।
উপসংহাৰ
এই টিউটোৰিয়েলত, আমি সামৰি লৈছো: পাইথন ব্যতিক্ৰম, ট্ৰেচবেক; Try / Except / অন্য / শেষত ৰ সৈতে ব্যতিক্ৰমসমূহ কেনেকৈ নিয়ন্ত্ৰণ কৰিব লাগেব্লকসমূহ, কেনেকৈ উত্থাপন কৰিব ব্যতিক্ৰমসমূহ, আৰু শেষত আমাৰ নিজৰ স্বনিৰ্বাচিত ব্যতিক্ৰমসমূহ কেনেকৈ সৃষ্টি কৰিব লাগে।
পঢ়াৰ বাবে ধন্যবাদ!
ইন্টাৰপ্ৰেটাৰে ইয়াক এটা অবৈধ কাৰ্য্য হিচাপে দেখে আৰু এটা ZeroDivisionErrorউত্থাপন কৰে, প্ৰগ্ৰামক বিঘ্নিত কৰে, আৰু এটা ট্ৰেচবেক প্ৰিন্ট কৰে।
আমি স্পষ্টকৈ চাব পাৰো যে ZeroDivisionError হৈছে উত্থাপন কৰা ব্যতিক্ৰম। সঁচাকৈয়ে পাইথনৰ নিজৰ উপায়েই আমাক কোৱা যে সংখ্যা এটাক শূন্যৰে ভাগ কৰাটো শীতল নহয়। যদিও জাভাস্ক্রিপ্টৰ দৰে আন ভাষাত, এইটো কোনো ভুল নহয়; আৰু পাইথনে এই প্ৰথা কঠোৰভাৱে নিষিদ্ধ কৰে।
আৰু, এইটো জনাটো গুৰুত্বপূৰ্ণ যে এইটো কেৱল এটা ব্যতিক্ৰম বস্তু আৰু পাইথনত এনে বহুতো বস্তু অন্তৰ্নিৰ্মিত আছে। সকলো পাইথন বিল্ট-ইন ব্যতিক্ৰম চাবলৈ এই পাইথন অফিচিয়েল নথিপত্ৰ পৰীক্ষা কৰক।
ট্ৰেচবেক বুজা
আমি ব্যতিক্ৰম নিয়ন্ত্ৰণ কৰাৰ আগতে, মই ভাবো যে ই ব্যতিক্ৰম হ'লে সঠিকভাৱে কি হ'ব সেয়া বুজিবলৈ সহায় কৰিব আৰু পাইথনে আমাৰ ভুলৰ বিষয়ে আমাক জনোৱাৰ বাবে কেনেকৈ সৰ্বোচ্চ কৰে।
যেতিয়াই পাইথনে এটা ভুলৰ সন্মুখীন হয়, ই এটা ব্যতিক্ৰম উত্থাপন কৰে। যদি এই ব্যতিক্ৰম নিয়ন্ত্ৰণ কৰা নহয়, তেন্তে ই ট্ৰেচবেক নামৰ কিছুমান তথ্য উৎপন্ন কৰে। গতিকে, এই ট্ৰেচবেকত কি তথ্য আছে?
ইয়াত আছে:
- এটা ভুল বাৰ্তা যিয়ে আমাক কয় যে কি ব্যতিক্ৰম উত্থাপন কৰা হৈছিল আৰু এই ব্যতিক্ৰমৰ আগতে কি হৈছিল raised.
- এই ভুলৰ কাৰণ হোৱা ক'ডৰ বিভিন্ন শাৰী সংখ্যা। কল ষ্টেক নামৰ ফাংচন কলৰ এটা ক্ৰমৰ ফলত এটা ভুল হ’ব পাৰে যিটো আমি ইয়াত পিছত আলোচনা কৰিম।
যদিও ই aঅলপ বিভ্ৰান্তিকৰ, আমি প্ৰতিশ্ৰুতি দিছো যে পৰৱৰ্তী উদাহৰণে আমাৰ বুজাবুজিলৈ অধিক পোহৰ আনিব।
ওপৰত 50 ক 0 ৰে ভাগ কৰাৰ পৰা প্ৰিন্ট কৰা ট্ৰেচবেকটো মনত পেলাওক, আমি চাব পাৰো যে ট্ৰেচবেকত নিম্নলিখিত তথ্য আছে:
- ফাইল “”: ই আমাক কয় যে এই ক'ড এটা কনছ'ল টাৰ্মিনেলৰ পৰা চলোৱা হৈছিল।
- শাৰী 1: ই আমাক কয় যে এই শাৰী সংখ্যাত ভুল হৈছে।
- ZeroDivisionError: division by zero: ই আমাক কয় যে কি ব্যতিক্ৰম উত্থাপন কৰা হৈছিল আৰু ইয়াৰ কাৰণ কি।
আহক আন এটা উদাহৰণ চেষ্টা কৰোঁ আৰু... হয়তো এটা কল ষ্টেক কেনেকুৱা দেখা যায় চাওক। এটা সম্পাদক খোলক, তলৰ ক'ড সুমুৱাওক আৰু tracebackExp .py
def stack1(numb): # 1 div = 0 # 2 stack2(numb, div) # 3 def stack2(numb, div): # 5 compute = numb/div # 6 print(compute) # 7 if __name__ == '__main__': # 9 numb = 5 # 10 stack1(numb) # 11
এই ফাইলত এটা টাৰ্মিনেল খোলক য'ত এই নথিপত্ৰ পোৱা যায় আৰু চলাওক।
python tracebackExp.py
আপুনি তলত দিয়া ট্ৰেচবেকটো দেখিব:
ওপৰৰ ট্ৰেচবেকটো বিভ্ৰান্তিকৰ যেন লাগিব পাৰে কিন্তু সঁচাকৈয়ে, নহয়। পাইথ'নিষ্টাছে ট্ৰেচবেক পঢ়িবলৈ সৰ্বোত্তম উপায় উলিয়াইছিল, যিটো তলৰ পৰা ওপৰলৈ । গতিকে, এই জ্ঞান ব্যৱহাৰ কৰি এই ট্ৰেচবেকে কি দিব পাৰে বুজিবলৈ চেষ্টা কৰোঁ আহক।
- সৰ্বাধিক তলত, আমি উত্থাপন কৰা ব্যতিক্ৰমটো পাওঁ আৰু কিয় উত্থাপন কৰা হৈছিল।
- ওপৰলৈ গৈ, আমি ফাইলৰ নাম tracebackExp .py পাম য'ত এই ভুল হৈছিল, এই ভুলৰ কাৰণ হোৱা গণনা গণনা = numb/div, ফাংচন stack2, আৰু লিংক নম্বৰ লাইন 6 য'ত এই গণনা কৰা হৈছিল .
- ওপৰলৈ গৈ আমি দেখিম যে আমাৰ stack2 ফাংচনলাইন নম্বৰ 3 ত ফাংচন stack1 ত কল কৰা হৈছিল।
- সৰ্বোচ্চলৈ গৈ আমি দেখিম যে ফাংচন stack1 ক লাইন নম্বৰ 11 ত কল কৰা হৈছিল। module > আমাক কয় যে ই এক্সিকিউট কৰা ফাইলটো।
সাধাৰণ পাইথন ব্যতিক্ৰমসমূহ
পাইথন লাইব্ৰেৰীয়ে বহুতো বিল্ট-ইন ব্যতিক্ৰম সংজ্ঞায়িত কৰে। আপুনি পাইথন দস্তাবেজ পৰীক্ষা কৰিব পাৰে বা বিল্ট-ইন local () ফাংচনক তলৰ দৰে কল কৰিব পাৰে:
>>> dir(locals()['__builtins__'])
আমি এই সকলো ব্যতিক্ৰম সম্বোধন কৰিবলৈ চেষ্টা নকৰো, কিন্তু আমি কেইটামান সাধাৰণ ব্যতিক্ৰম দেখিম আপুনি সম্ভৱতঃ সন্মুখীন হ'ব।
#1) TypeError
এইটো উত্থাপন কৰা হয় যেতিয়া এটা অপাৰেচন বা ফাংচন এটা অনুপযুক্ত ধৰণৰ এটা বস্তুত প্ৰয়োগ কৰা হয়।
উদাহৰণ ১
তলৰ প্ৰগ্ৰেমটো বিবেচনা কৰক। ই এটা ডিভিডেণ্ড আৰু ডিভাইজাৰ লয়, তাৰ পিছত ডিভিডেণ্ডক ডিভাইজাৰেৰে ভাগ কৰাৰ ফলাফল গণনা কৰি প্ৰিন্ট কৰে।
def compute_division(): dividend = int(input("Enter the dividend: ")) # cast string to int divisor = input("Enter the divisor: ") # no casting # Compute division result = dividend/divisor # print result print("The result of {}/{} is: {}".format(dividend, divisor, result)) if __name__ == '__main__': result = compute_division()
আমি ব্যৱহাৰকাৰীৰ পৰা ডিভিডেণ্ড আৰু ডিভাইজাৰৰ মূল্য বিচাৰো, কিন্তু আমি ডিভাইজাৰৰ ষ্ট্ৰিং কাষ্ট কৰিবলৈ পাহৰি যাওঁ মান এটা পূৰ্ণসংখ্যালৈ পৰিণত কৰক। গতিকে, আমি শেষত লভ্যাংশৰ ধৰণ পূৰ্ণসংখ্যা( int ) আৰু হৰণকাৰীৰ ধৰণ ষ্ট্ৰিং( str ) হ’ব। তাৰ পিছত আমি TypeError পাওঁ কাৰণ বিভাজন অপাৰেটৰে (/) ষ্ট্ৰিংসমূহত কাম নকৰে।
আপুনি জানিবলৈ আগ্ৰহী হ'ব পাৰে যে পাইথনৰ দৰে নহয়, জাভাস্ক্রিপ্টত Type Coercion আছে যিয়ে মূলতঃ অপাৰেণ্ডৰ এটা ধৰণক আনটো অপাৰেণ্ডৰ ধৰণৰ সমতুল্য মানলৈ ৰূপান্তৰ কৰে যেতিয়া অপাৰেণ্ডসমূহৰ হয়
#2) ValueError
এইটো উত্থাপন কৰা হয় যেতিয়া এটা অপাৰেচন বা ফাংচনে এটা যুক্তি গ্ৰহণ কৰে যাৰ সঠিক ধৰণ কিন্তু এটা অনুপযুক্ত মান।
উদাহৰণ 2
ওপৰৰ উদাহৰণ 1 ত আমাৰ প্ৰগ্ৰেমটো বিবেচনা কৰক।
যদি ব্যৱহাৰকাৰীয়ে '3a'ৰ দৰে লভ্যাংশৰ বাবে এটা আলফানিউমেৰিক মান ইনপুট কৰে, তেন্তে আমাৰ প্ৰগ্ৰেমে বৃদ্ধি পাব ValueError ব্যতিক্ৰম। কাৰণ, যদিও পাইথন int() পদ্ধতিয়ে যিকোনো সংখ্যা বা ষ্ট্ৰিং লয় আৰু এটা পূৰ্ণসংখ্যা বস্তু ঘূৰাই দিয়ে, ষ্ট্ৰিং মানত আখৰ বা কোনো অসংখ্যাগত মান থাকিব নালাগে।
#3) AttributeError
এই ব্যতিক্ৰমটো এটা বৈশিষ্ট্য নিযুক্ত বা উল্লেখ কৰাৰ সময়ত উত্থাপন কৰা হয় যি অস্তিত্বহীন।
উদাহৰণ 3
প্ৰগ্ৰামটো বিবেচনা কৰক তলত. ই এটা সংখ্যা লয় আৰু পাইথন গণিত মডিউল ব্যৱহাৰ কৰি ইয়াৰ বৰ্গমূল গণনা কৰে
import math # import math library to gain access to its code def compute_square_root(number): # compute the square root using the math library result = math.sqr(number) return result if __name__ == '__main__': # get input to compute from user number = int(input("Compute Square root of: ")) # call function to compute square root
যেতিয়া কোনো ব্যৱহাৰকাৰীয়ে এটা সংখ্যা প্ৰৱেশ কৰে, আমাৰ প্ৰগ্ৰেমে গণিত মডিউলৰ পৰা এটা ফাংচন ব্যৱহাৰ কৰি ইয়াৰ বৰ্গমূল গণনা কৰিবলৈ চেষ্টা কৰে কিন্তু ইয়াত ঠিক সেইটোৱেই, আমি এটা ভুল কৰিলোঁ। sqrt ৰ পৰিবৰ্তে আমি ভুলকৈ sqr টাইপ কৰিলোঁ যিটো গণিত মডিউলত নাই।
গতিকে, আমি এটা বৈশিষ্ট্য sqr ৰেফাৰেন্স কৰিবলৈ চেষ্টা কৰি আছিলো যিটো নাই আৰু led AttributeError উত্থাপন কৰা ব্যতিক্ৰমলৈ। আমাৰ বেছিভাগেই এই ধৰণৰ ভুল বহুত কৰো। গতিকে, আপুনি অকলশৰীয়া নহয়।
Try Except ৰ সৈতে ব্যতিক্ৰমসমূহ নিয়ন্ত্ৰণ কৰা
এজন প্ৰগ্ৰেমাৰ হিচাপে, এটা কথা যিটোত আমাৰ বেছিভাগেই আমাৰ সময় খৰচ কৰিম সেয়া হ'ল এটা শক্তিশালী ক'ড লিখা যিটো হ'লপ্ৰাণৱন্ত. কিছুমান ভুলৰ বাবে ভাঙি নপৰা ক’ড৷ পাইথনত আমি আমাৰ বিবৃতিসমূহ try – except বিবৃতিৰ ভিতৰত আবদ্ধ কৰি ইয়াক লাভ কৰিব পাৰো।
পাইথন Try-Except বিবৃতি
try-except বিবৃতিৰ নিম্নলিখিত গঠন আছে:
try: #your code goes here except """Specify exception type(s) here""": #handle exception here
এটা try-except বিবৃতিৰ ভিতৰত tracebackExp .py ত ক'ড আবদ্ধ কৰোঁ আহক।
def stack1(numb): # 1 div = 0 # 2 stack2(numb, div) # 3 def stack2(numb, div): # 5 try: # 6 compute = numb/div # 7 print(compute) # 8 except ZeroDivisionError as zde: # 9 print(zde) # 10 if __name__ == '__main__': # 12 numb = 5 # 13 stack1(numb) # 14 print("program continuous") # 15
এই ক'ড চলালে আউটপুট উৎপন্ন হ'ব
এই ধৰণে try-except বিবৃতিটোৱে কাম কৰে। পাইথনে চেষ্টা ব্লক শাৰী 7-8 ত ক'ড এক্সিকিউট কৰে। যদি কোনো অবৈধ ক'ড পোৱা নাযায়, তেন্তে except block line 10 ৰ ক'ড এৰি দিয়া হয় আৰু এক্সিকিউচন অব্যাহত থাকে।
কিন্তু, যদি এটা অবৈধ ক'ড পোৱা যায়, তেন্তে এক্সিকিউচন তৎক্ষণাত বন্ধ হয় চেষ্টা কৰক ব্লক আৰু উত্থাপিত ব্যতিক্ৰম আমি except বিবৃতি শাৰী 9 ত প্ৰদান কৰা ব্যতিক্ৰমৰ সৈতে মিল আছে নেকি পৰীক্ষা কৰে। যদি ই মিলে, তেন্তে except ব্লকটো এক্সিকিউট কৰা হয় আৰু চলি থাকে। যদি নহয়, তেন্তে প্ৰগ্ৰামটোৱে বাধা দিব।
ট্ৰাই-ব্লকত সাধাৰণতে ক'ড থাকে যি এটা ব্যতিক্ৰম উত্থাপন কৰিব পাৰে যেতিয়া এক্সচেপ্ট-ব্লকে ব্যতিক্ৰম ধৰিব আৰু নিয়ন্ত্ৰণ কৰে।
একাধিক নিয়ন্ত্ৰণ কৰা
ৰ বাহিৰে ব্যতিক্ৰম আমি এটা “ব্যতিক্ৰম” বা একাধিক “ব্যতিক্ৰম”ৰ সৈতে একাধিক ব্যতিক্ৰম নিয়ন্ত্ৰণ কৰিব পাৰো। ই সকলো নিৰ্ভৰ কৰে আপুনি প্ৰতিটো ব্যতিক্ৰম কেনেকৈ নিয়ন্ত্ৰণ কৰিব বিচাৰে তাৰ ওপৰত।
#1) এটা ব্যতিক্ৰমৰ সৈতে একাধিক ব্যতিক্ৰম নিয়ন্ত্ৰণ কৰা
try: #your code goes here except(Exception1[, Exception2[,...ExceptionN]]]): #handle exception here
এই পদ্ধতি ব্যৱহাৰ কৰা হয় যেতিয়া আমি সন্দেহ কৰোঁ যে আমাৰ ক'ডে হ'ব পাৰেবিভিন্ন ব্যতিক্ৰম উত্থাপন কৰক আৰু আমি প্ৰতিটো ক্ষেত্ৰতে একে ব্যৱস্থা ল'ব বিচাৰো। গতিকে, যদি পাইথন ইন্টাৰপ্ৰেটাৰে এটা মিল বিচাৰি পায়, তেন্তে এক্সেপ্ট ব্লকত লিখা ক'ডটো এক্সিকিউট হ'ব।
তলৰ উদাহৰণ পাইথন ক'ডটো বিবেচনা কৰা যাওক
def get_fraction(value, idx): arr = [4,5,2,0] # a list of numbers idx_value = arr[idx] # if idx is > arr length, IndexError will be raised value/idx_value # if idx_value == 0, ZeroDivisionError will be raised if __name__ =='__main__': # set 'value' and 'idx' value = 54 idx = 3 # call function in a try-except statement. try: result = get_fraction(value, idx) print("Fraction is ", result) except (IndexError, ZeroDivisionError) as ex: print(ex)
আমাৰ দুটা আছে সম্ভাৱ্য ব্যতিক্ৰমসমূহ যি ইয়াত উত্থাপন কৰিব পাৰি, ZeroDivisionError আৰু IndexError । যদি এই ব্যতিক্ৰমসমূহৰ কোনো এটা উত্থাপন কৰা হয়, তেন্তে ব্যতিক্ৰম ব্লকটো এক্সিকিউট কৰা হ'ব।
ওপৰৰ ক'ডত, idx=3, গতিকে idx_ মান 0 আৰু মান হয় /idx_ মান এ ZeroDivisionError
উত্থাপন কৰিব #2) একাধিক ব্যতিক্ৰমৰ সৈতে একাধিক ব্যতিক্ৰম নিয়ন্ত্ৰণ কৰা
try: #your code goes here except Exception1: #handle exception1 here except Exception2: #handle exception2 here except ExceptionN: #handle exceptionN here
যদি আমি নিয়ন্ত্ৰণ কৰিব বিচাৰো প্ৰতিটো ব্যতিক্ৰম পৃথকে পৃথকে, তেন্তে আপুনি ইয়াক কেনেকৈ কৰিব পাৰে।
তলৰ পাইথন ক'ডৰ উদাহৰণ বিবেচনা কৰক
def get_fraction(value, idx): arr = [4,5,2,0] # a list of numbers idx_value = arr[idx] # if idx is > arr length, IndexError will be raised value/idx_value # if idx_value == 0, ZeroDivisionError will be raised if __name__ =='__main__': # set 'value' and 'idx' value = 54 idx = 5 # call function in a try-excepts statement. try: result = get_fraction(value, idx) print("Fraction is ", result) except IndexError: print("idx of {} is out of range".format(idx)) except ZeroDivisionError: print("arr[{}] is 0. Hence, can't divide by zero".format(idx)) except Exception as ex: print(ex) print("Not sure what happened so not safe to continue, \ app will be interrupted") raise ex
আমি ইয়াত লক্ষ্য কৰিছো যে শেষৰ except বিবৃতিত Exception ব্যৱহাৰ কৰা হৈছিল . কাৰণ ব্যতিক্ৰম বস্তু Exception যিকোনো ব্যতিক্ৰমৰ সৈতে মিলে। এই কাৰণে, ই সদায় শেষ হ'ব লাগে, যিহেতু পাইথনে অন্য ব্যতিক্ৰম নিয়ন্ত্ৰকসমূহ এবাৰ মিললে পৰীক্ষা কৰা বন্ধ কৰিব।
ওপৰৰ ক'ডত, idx=5 , সেয়েহে arr[idx ] এ IndexError উত্থাপন কৰিব কাৰণ idx তালিকাৰ দৈৰ্ঘ্যতকৈ বেছি arr
আৰু, আপোনাৰ এপ্লিকেচনে কি ব্যতিক্ৰম উত্থাপন কৰিছে সেয়া নিশ্চিত নহয়, নিষ্পাদন অব্যাহত ৰাখিবলৈ কেতিয়াও নিৰাপদ নহয়। সেইবাবেই আমাৰ ওচৰত যিকোনো অভাৱনীয় ব্যতিক্ৰম ধৰিবলৈ Exception টাইপ আছে। তাৰ পিছত, আমি জনাই দিওঁ...ব্যৱহাৰকাৰী আৰু একে ব্যতিক্ৰম উত্থাপন কৰি এপ্লিকেচনক বাধা দিয়ক।
অন্যথা চেষ্টা কৰক বিবৃতি
এইটো ব্যতিক্ৰম নিয়ন্ত্ৰণৰ এটা ঐচ্ছিক বৈশিষ্ট্য আৰু আপুনি বিচৰা ক'ড যোগ কৰাৰ অনুমতি দিয়ে কোনো ভুল নহ'লে চলাওক। যদি এটা ভুল হয়, এই else-block চলিব নোৱাৰিব ।
তলৰ উদাহৰণ পাইথন ক'ড বিবেচনা কৰক, আপোনাৰ সম্পাদক খোলক আৰু ক'ডটো elseTry.py
def fraction_of_one(divisor): value = 1/divisor # if divisor is zero, ZeroDivisionError will be raised return value if __name__ == '__main__': while True: try: # Get input from the user. # if input is not a valid argument for int(), ValueError will be raised divisor = int(input("Enter a divisor: ")) # call our function to compute the fraction value = fraction_of_one(divisor) except (ValueError, ZeroDivisionError): print("Input can't be zero and should be a valid literal for int(). Please, try again!") else: print("Value: ", value) break0 হিচাপে সংৰক্ষণ কৰক>আমি ব্যৱহাৰকাৰীৰ পৰা ইনপুট পাওঁ আৰু ইয়াক 1 বিভাজন কৰিবলৈ ব্যৱহাৰ কৰো। ইয়াত আমাৰ দুটা সম্ভাৱ্য ব্যতিক্ৰম আছে, এটা অবৈধ ব্যৱহাৰকাৰী ইনপুট যিয়ে ValueErrorআৰু এটা zero(0)কাৰণ হ'ব শূন্যবিভাজন ভুল। আমাৰ except ষ্টেটমেন্টে এই ভুলসমূহ নিয়ন্ত্ৰণ কৰে।
এতিয়া, আমি value ৰ মান প্ৰিন্ট কৰিব বিচাৰো। আমাৰ else-block এ নিশ্চিত কৰে যে ইয়াক প্ৰিন্ট কৰা হয় যদিহে আমাৰ try block কোনো ভুল নোহোৱাকৈ এক্সিকিউট হয়। এইটো গুৰুত্বপূৰ্ণ কাৰণ যদি আমাৰ ট্ৰাই-ব্লকত এটা ভুল হয়, মান অসংজ্ঞায়িত হ'ব। গতিকে, ইয়াক অভিগম কৰিলে আন এটা ভুল উত্থাপন হ'ব।
ওপৰৰ ক'ডটো Python elseTry.py ৰ সৈতে চলাওক
ওপৰৰ আউটপুটে সেইটো দেখুৱাইছে প্ৰথম ইনপুটৰ বাবে, আমি 0 টাইপ কৰিলোঁ আৰু ENTER টিপিলোঁ। যিহেতু আমাৰ বিভাজনে 0 লাভ কৰিছিল, 1/ভাজকে zeroDivisionError উত্থাপন কৰিলে। আমাৰ দ্বিতীয় ইনপুট আছিল k যি int () ৰ বাবে অবৈধ, সেয়েহে ব্যতিক্ৰম ValueError উত্থাপন কৰা হৈছে।
কিন্তু আমাৰ শেষ ইনপুট আছিল 9 যি বৈধ আৰু a হিচাপে ফলত, আমি “ value ” ৰ মানটো 0.1111111111111111
হিচাপে প্ৰিন্ট কৰা পালোঁবিবৃতি
এইটো ব্যতিক্ৰম নিয়ন্ত্ৰণৰ এটা ঐচ্ছিক বৈশিষ্ট্য আৰু ব্যতিক্ৰম নিয়ন্ত্ৰকসমূহত যিয়েই নহওক কিয় সদায় চলিব।
অৰ্থাৎ:
- এটা ব্যতিক্ৰম ঘটে নে নহয়
- যদিও অন্য ব্লকসমূহত এটা 'ৰিটাৰ্ণ' কল কৰা হয়।
- যদিও অন্য ব্লকসমূহত লিপি এৰি দিয়া হয়
গতিকে, যদি আমাৰ এটা ক'ড আছে যিটো আমি সকলো পৰিস্থিতিত চলাব বিচাৰো, finally-block আমাৰ ল'ৰা। এই ব্লকটো বেছিভাগেই ফাইলসমূহ বন্ধ কৰাৰ দৰে পৰিষ্কাৰ-পৰিচ্ছন্নতাৰ বাবে ব্যৱহাৰ কৰা হয়।
তলৰ উদাহৰণ পাইথন ক'ড বিবেচনা কৰক
def readFile(file_path): try: openFile = open(file_path,'r') # Open a file as read-only print(openFile.readline()) # Read first line of file content except FileNotFoundError as ex: print(ex) finally: print("Cleaning...") openFile.close() if __name__ == '__main__': filePath = './text.txt' readFile(filePath)
এই ক'ডে text.txt ফাইলটো খোলিবলৈ আৰু পঢ়িবলৈ চেষ্টা কৰে ইয়াৰ বৰ্তমান ডাইৰেকটৰীত। যদি ফাইলটো আছে, তেন্তে আমাৰ প্ৰগ্ৰেমে ফাইলটোৰ প্ৰথম শাৰীটো প্ৰিন্ট কৰিব তাৰ পিছত আমাৰ finally-block এ ফাইলটো চলাব আৰু বন্ধ কৰিব।
কওকচোন এই প্ৰগ্ৰেমটো ফাইল থকা ডাইৰেকটৰীত আমাৰ text.txt নামৰ এটা ফাইল আছে হৈছে আৰু ইয়াত Hello আছে। যদি আমি প্ৰগ্ৰেমটো চলাওঁ, তেন্তে আমাৰ হাতত আউটপুট থাকিব
এই উদাহৰণটো ইচ্ছাকৃতভাৱে বাছি লোৱা হৈছিল কাৰণ মই বিচাৰিছিলো যে আমি এটা সৰু সমস্যাৰ সমাধান কৰোঁ যিটো শেষত- block.
যদি ফাইলটো নাই, ব্যতিক্ৰম FileNotFoundError উত্থাপন কৰা হ'ব আৰু চলক openFile সংজ্ঞায়িত নহ'ব আৰু এটা ফাইল নহ'ব বস্তু. সেয়েহে, ইয়াক finally-block ত বন্ধ কৰিবলৈ চেষ্টা কৰিলে এটা ব্যতিক্ৰম UnboundLocalError উত্থাপন হ'ব যিটো NameError ৰ এটা উপশ্ৰেণী।
এইটোৱে মূলতঃ কয় যে আমি উল্লেখ কৰিবলৈ চেষ্টা কৰিছো the