در دهکدهی اسرارآمیز Coinholt، شما پشت پیشخوان نانواییتان ایستادهاید و دستهای تازه از شیرینیها را میچینید. در به صدا در میآید و باز میشود و Denara وارد میشود؛ بازرگانی ماهر که چشمی تیزبین برای کالاهای باکیفیت دارد. پس از صرف غذایی سریع، سکهای درخشان را روی پیشخوان میلغزاند که ارزشی برابر با ۱۰۰ واحد دارد.
لبخند میزنید، سکه را برمیدارید و نگاهی به هزینهی کل غذا میاندازید: ۸۸ واحد. یعنی باید ۱۲ واحد باقی پول پس بدهید.
Denara با انتظار دستش را دراز میکند. «فقط کمترین تعداد سکه را به من بدهید»، با لبخندی میگوید. «کیسهی من از قبل پُر است و نمیخواهم در راه خطر گم شدنشان را بپذیرم.»
میدانید که چند گزینه دارید. «برای باقی پول، Lumis (به ارزش ۱۰ واحد)، Viras (به ارزش ۵ واحد) و Zenth (به ارزش ۲ واحد) در دسترس داریم.»
شما بهسرعت احتمالها را در ذهن خود حساب میکنید:
«بهترین انتخاب دو سکه است: یک Lumis و یک Zenth»، میگویید و باقی پول را به او میدهید.
Denara لبخند میزند و آشکارا تحت تأثیر قرار گرفته است. «مثل همیشه، درست انجامش دادید.»
کمترین تعداد سکه را تعیین کنید که به مشتری داده شود، بهطوری که مجموع ارزش آنها با مقدار درست خرد برابر باشد.
گاهی لازم است یک استثنا ایجاد کنید. وقتی این کار را میکنید، باید همیشه یک پیام خطای معنادار را هم بگنجانید که نشان دهد منبع خطا چیست. این کار کد شما را خواناتر میکند و کمک چشمگیری به debug کردن میکند. در موقعیتهایی که میدانید منبع خطا نوع مشخصی دارد، میتوانید یکی از انواع خطای توکار را ایجاد کنید، اما همچنان باید پیام معناداری را در آن بگنجانید.
این تمرین خاص میخواهد که از دستور raise استفاده کنید تا وقتی نمیتوان با سکههای دادهشده پول را خرد کرد، یک ValueError را «پرتاب» کنید. آزمونها تنها در صورتی قبول میشوند که هم exception را raise کنید و هم پیامی همراه آن بیاورید.
برای raise کردن یک ValueError همراه با پیام، پیام را بهعنوان آرگومانی برای نوع exception بنویسید:
# example when change cannot be made with the coins passed in
raise ValueError("can't make target with given coins")