সেটিং
কখন এবং কীভাবে ব্যতিক্রম ব্যবহার করতে হয় তা নির্ধারণ করতে আমার প্রায়শই সমস্যা হয়। আসুন একটি সাধারণ উদাহরণ বিবেচনা করুন: মনে করুন যে আমি একটি ওয়েবপৃষ্ঠা স্ক্র্যাপ করছি , আবে ভিগোদা এখনও বেঁচে আছে কিনা তা নির্ধারণ করতে " http://www.abevigoda.com/ " বলুন । এটি করার জন্য, আমাদের কেবল পৃষ্ঠাটি ডাউনলোড করতে হবে এবং "আবে ভিগোদা" শব্দটি প্রদর্শিত হবে এমন সময়গুলির সন্ধান করুন। আমরা প্রথম উপস্থিতি ফিরে আসি, যেহেতু এর মধ্যে আবের স্থিতি অন্তর্ভুক্ত। ধারণাগতভাবে, এটি দেখতে এটির মতো হবে:
def get_abe_status(url):
# download the page
page = download_page(url)
# get all mentions of Abe Vigoda
hits = page.find_all_mentions("Abe Vigoda")
# parse the first hit for his status
status = parse_abe_status(hits[0])
# he's either alive or dead
return status == "alive"
যেখানে parse_abe_status(s)
"আবে ভিগোদা কিছু হয়" ফর্মটির একটি স্ট্রিং নিয়ে যায় এবং " কিছু " অংশ প্রদান করে।
আপনার যুক্তির আগে এই যে আবের স্থিতির জন্য এই পৃষ্ঠাটি স্ক্র্যাপ করার আরও ভাল এবং আরও শক্তিশালী উপায় রয়েছে, মনে রাখবেন যে এটি আমি যে একটি সাধারণ পরিস্থিতি হাইলাইট করার জন্য ব্যবহৃত একটি সাধারণ এবং নিয়মিত উদাহরণ।
এখন, এই কোডটি কোথায় সমস্যার সম্মুখীন হতে পারে? অন্যান্য ত্রুটিগুলির মধ্যে কিছু "প্রত্যাশিত" টি হ'ল:
download_page
পৃষ্ঠাটি ডাউনলোড করতে সক্ষম না হতে পারে এবং একটি নিক্ষেপ করেIOError
।- URL টি সঠিক পৃষ্ঠায় নির্দেশ নাও করতে পারে, বা পৃষ্ঠাটি ভুলভাবে ডাউনলোড করা হয়েছে, এবং তাই কোনও হিট নেই।
hits
খালি তালিকা, তারপর। - ওয়েব পৃষ্ঠাটি পরিবর্তন করা হয়েছে, সম্ভবত পৃষ্ঠাটি সম্পর্কে আমাদের অনুমানগুলি ভুল করেছে। সম্ভবত আমরা অ্যাবে ভিগোদার 4 টি উল্লেখ আশা করি, তবে এখন আমরা 5 টি পেয়েছি।
- কিছু কারণে,
hits[0]
"অ্যাবে ভিগোডা কিছু " এই ফর্মের স্ট্রিং নাও থাকতে পারে এবং তাই এটি সঠিকভাবে বিশ্লেষণ করা যায় না।
প্রথম IOError
কেসটি আমার পক্ষে আসলেই সমস্যা নয়: একটি নিক্ষিপ্ত হয় এবং আমার ফাংশনটির কলকারী এটি পরিচালনা করতে পারে। সুতরাং আসুন অন্যান্য কেসগুলি এবং আমি কীভাবে তাদের পরিচালনা করতে পারি তা বিবেচনা করা যাক। তবে প্রথমে, ধরে নেওয়া যাক আমরা parse_abe_status
সম্ভব বোকামি উপায়ে বাস্তবায়ন করি :
def parse_abe_status(s):
return s[13:]
যথা, এটি কোনও ত্রুটি পরীক্ষা করে না। এখন, বিকল্পগুলিতে:
বিকল্প 1: ফিরে None
আমি কলকারীকে বলতে পারি যে ফিরে এসে কিছু ভুল হয়েছে None
:
def get_abe_status(url):
# download the page
page = download_page(url)
# get all mentions of Abe Vigoda
hits = page.find_all_mentions("Abe Vigoda")
if not hits:
return None
# parse the first hit for his status
status = parse_abe_status(hits[0])
# he's either alive or dead
return status == "alive"
যদি কলকারী None
আমার ফাংশনটি থেকে গ্রহণ করে তবে তার ধরে নেওয়া উচিত যে আবে ভিগোদার কোনও উল্লেখ নেই, এবং তাই কিছু ভুল হয়েছে। তবে এটি বেশ অস্পষ্ট, তাই না? এবং এটি কেসটিকে সহায়তা করে না যেখানে hits[0]
আমরা যা ভেবেছিলাম তা নয়।
অন্যদিকে, আমরা কিছু ব্যতিক্রম রাখতে পারি:
বিকল্প 2: ব্যতিক্রম ব্যবহার করে
যদি hits
খালি থাকে, একটি IndexError
নিক্ষিপ্ত হবে যখন আমরা প্রচেষ্টা hits[0]
। তবে কলকারী IndexError
আমার ফাংশনটি নিক্ষেপ করবেন বলে আশা করা উচিত নয় , যেহেতু তিনি জানেন না যে এটি IndexError
কোথা থেকে এসেছে; এটি ছুঁড়ে ফেলা যেত find_all_mentions
, কারণ তিনি জানেন। সুতরাং আমরা এটি পরিচালনা করতে একটি কাস্টম ব্যতিক্রম ক্লাস তৈরি করব:
class NotFoundError(Exception):
"""Throw this when something can't be found on a page."""
def get_abe_status(url):
# download the page
page = download_page(url)
# get all mentions of Abe Vigoda
hits = page.find_all_mentions("Abe Vigoda")
try:
hits[0]
except IndexError:
raise NotFoundError("No mentions found.")
# parse the first hit for his status
status = parse_abe_status(hits[0])
# he's either alive or dead
return status == "alive"
এখন যদি পৃষ্ঠাটি পরিবর্তন হয়ে যায় এবং হিটের অপ্রত্যাশিত সংখ্যক সংখ্যা থাকে? কোডটি এখনও কাজ করতে পারে বলে এটি বিপর্যয়কর নয়, তবে একজন কলকারী অতিরিক্ত সতর্কতা অবলম্বন করতে চান, বা তিনি কোনও সতর্কতা লগ করতে চাইতে পারেন। সুতরাং আমি একটি সতর্কতা নিক্ষেপ করব:
class NotFoundError(Exception):
"""Throw this when something can't be found on a page."""
def get_abe_status(url):
# download the page
page = download_page(url)
# get all mentions of Abe Vigoda
hits = page.find_all_mentions("Abe Vigoda")
try:
hits[0]
except IndexError:
raise NotFoundError("No mentions found.")
# say we expect four hits...
if len(hits) != 4:
raise Warning("An unexpected number of hits.")
logger.warning("An unexpected number of hits.")
# parse the first hit for his status
status = parse_abe_status(hits[0])
# he's either alive or dead
return status == "alive"
শেষ অবধি, আমরা দেখতে পাব যে status
তা জীবিত বা মৃত নয়। হতে পারে, কোনও অদ্ভুত কারণে, আজ এটি পরিণত হয়েছিল comatose
। তারপরে আমি আর ফিরে আসতে চাই না False
, কারণ এতে বোঝা যায় যে আবে মারা গেছেন। আমার এখানে কি করা উচিত? সম্ভবত একটি ব্যতিক্রম নিক্ষেপ। তবে কী রকম? আমি কি কাস্টম ব্যতিক্রম ক্লাস তৈরি করব?
class NotFoundError(Exception):
"""Throw this when something can't be found on a page."""
def get_abe_status(url):
# download the page
page = download_page(url)
# get all mentions of Abe Vigoda
hits = page.find_all_mentions("Abe Vigoda")
try:
hits[0]
except IndexError:
raise NotFoundError("No mentions found.")
# say we expect four hits...
if len(hits) != 4:
raise Warning("An unexpected number of hits.")
logger.warning("An unexpected number of hits.")
# parse the first hit for his status
status = parse_abe_status(hits[0])
if status not in ['alive', 'dead']:
raise SomeTypeOfError("Status is an unexpected value.")
# he's either alive or dead
return status == "alive"
বিকল্প 3: কোথাও কোথাও
আমি মনে করি যে ব্যাতিক্রম সহ দ্বিতীয় পদ্ধতিটি পছন্দনীয়, তবে আমি নিশ্চিত নই যে আমি এর মধ্যে ব্যতিক্রমগুলি সঠিকভাবে ব্যবহার করছি কিনা। আরও অভিজ্ঞ প্রোগ্রামাররা কীভাবে এটি পরিচালনা করবে তা দেখার জন্য আমি আগ্রহী।