صفحه 1:
مظفر بگ محمدی
دانشكاه ايلام
صفحه 2:
رسیدگی به خطاها
در یک جهان ایده آل تمام خطاها در هنگام کامپایل کد اتفاق می افتد و
رفع می شوند. لذا هنگام اجرا خطایی رخ نمی دهد. اما در واقعیت
اینطور نیست.
© خطاها هنگام اجراى كد اتفاق می افتند و باید توسط مکانیسمی مورد
رسیدگی قرار گیرند که:
به تولید کننده (یا تشخیص دهنده) ی خطا اجازه میدهد که اطلاعات
خطا را به گیرنده ی خطا ارسال نماید و این گيرنده است که می داند با
خطا چکار کند.
صفحه 3:
روش رسیدگی به خطاها در C
#define DEPOSIT NEGATIVE -1
#define DEPOSIT OK 0
int VerifyDeposit(int amount) {
if (amount < 0 )
return DEPOSIT NEGATIVE;
else
return DEPOSIT OK
}
int depositStatus = VerifyDeposit(amt) ;
if (depositStatus == DEPOSIT OK) }
// do something good
} else {
// deal with the error
}
صفحه 4:
روش بهتر رسیدگی به خطا
؟ تفکیک تشخیص خطا از رسیدگی به خطا
# پیاده کننده ی کلاس خطاها را تشخیص می دهد.
# کاربر کلاس تصمیم مى كيرد که با خطا چکار کند.
خروح از برنامه
چاپ پیفام مناسب و ادامه ی برنمه
اجرای مجده متد دارای خطا
سوال از کاربر
یا هر کار مناسب دیگر
کاهش پیچیدگی کد
کد عادی برنامه که اگر اتفاق ناجوری نیفتد کار خواهد کرد » از کدی که به خطاها رسیدگی می کند جدا شده
جاوا برنامه نویس را مجبور می کند که به خطا رسیدگی کند.
صفحه 5:
try-throw-catch
روش پایه ی رسیدگی به خطاها در جاوا استفاده از سه گانه ی
«cul throw-catch
try-
©
صفحه 6:
try-throw-catch ju.
Scanner in = new Scanner( System.in);
System.out.println( “Enter Amt: “);
try {
int amt = in.nextInt( );
if (amt < 0)
throw new Exception( “Negative value was input”);
System.out.println (“Thanks for your deposit”);
// more code that assumes the amt is not negative
catch( Exception e )
// do something about the exception
1
55۲۵۲۰۵۵۰۵۲۱۸۸) ۳۲۵۷۵ a nice day”);
صفحه 7:
بلوک ۲۲۷
# کدی که ممکن است استشا تولید کند در داخل بلوک ۲۷ قرار می گیرد.
#بلوک ۲۷ شامل کد اصلی الگوریتم یا برنامه ی کاربر است.
این بلوک روند درست انجام کار را مشخص می کند.
© کدی که به خطا رسیدگی می کند در داخل بلوک 31:11 قرار می گیرد.
#بلوک 631611 بلافاصله بعد از بلوک 79۷ قرار دارد.
صفحه 8:
throw,
وقتی که کد برنامه خطا را تشخیص داد یک شی از نوع استتا را گسیل می کند.
public class BankAccount {
private int balance;
public BankAccount( ) {
balance =
public int getBalance( ) { return balance; }
// precondition — amount must be nonnegative
// throws an exception if amount is negative
// postcondition — balance updated
public int deposit( int amt ) throws Exception {
if (amt <0)
throw new Exception(“Deposit is Negative” );
balance += amt;
صفحه 9:
2 م
کد درست سپرده گذاری در بانک
public class DepositExample {
public static void main( String[ ] args ) {
BankAccount myAccount = new BankAccount( );
try {
Scanner input = new Scanner( System.in );
System.out.print(“Enter deposit amount: “);
int amt = input.nextInt();
myAccount.deposit( amt );
System.out.println( “New Balance = “ +
myAccount .getBalance()) ;
catch (Exception e)
{
// code that “handles” a negative deposit
System. out.println( e.getMessage( ));
+
System.out.println( “GoodBye” );
صفحه 10:
(
try-throw-catch مکانیسم
#هنگام گسیل استشنه اجرای کد بلوک 172 متوقف می شود و اجرا به بلوک
1 منتقل می شود.
مقدار گسیل شده همان پارامتر دستور 0۲0۷۷ است و یک شی از کلاس
استثنا اسث.
#بلوک 011۱ یک پارامتر دارد که از طریق دستور 0۲0۷۷ برای آن
گسیل می شود.
#اجرای بلوک CATCH همان عمل رسیدگی به استثتا است.
صفحه 11:
2 م
try-throw-catch 21,
catch( Exceptione) {.. . }
© شناسه ی 6 در سرآیند بلوک ۵111 همان پارامتر بلوک
.cwicatch
© پارامتر بلوک 6016 دو کاربرد دارد:
2 مشخص کردن نوع استثقای گسیل شده (در مثال فوق
(Exception
نامگذاری استثنا (در مثال فوق همان 6). می توان به جای 6 از هر اسم
دیگری استفاده کرد.
| © )
صفحه 12:
try-catch Control Flow
[| لو( codes kere
صفحه 13:
try-catch Control Flow
حالت ۲
AS ge Ap td SHY Sh
اجرای بلوک 137 متوقف می شود.
اجراى بلوك 2617© شروع می شود.
يعد از اتمام اجرلى بلوك 8112©
بقیه ی براه زا می شود hore موی م09 |
صفحه 14:
کلاسهای "6266011010
* زبان جاوا کلاسی به اسم 8266۳131011 تعریف کرده است.
© در کتابخانه های جاوا کلاسهای استثغای دیگری نیز وجود دارند.
برنامه نویس می تواند کلاس استثشای جدیدی تعریف AS
تمام کلاسهای استثنای تعریف شده توسط جاوا دو خاصیت دارند:
یک جزء سازنده دارند که آرگومان آن از نوع رشته است.
یک متد به اسم 961655306 دارند که رشته ی ارسال شده به كلاس استثنا در
هنكام ساخت شی را بر می گرداند.
* کلاسهای استششای تعریف شده توسط پرنامه نويس نيز بايد اين خاصيتها را داشته
باشند.
صفحه 15:
کلاس ۴6266۵۳010۳
© كلاس 2766011011 ريشه ى بقيه بى كلاسهاى استثنا است.
© اكر جه مى توان از كلاس 0131011 ©2066 مستقيماً استفاده كرد بهتر
است كه از اين کلاس یک كلاس جديد مشتق کنیم و از آن استفاده کنیم.
8 کلاس ۲۱666۳31010 در بسته ی 12110 ۰ 2۷2 [ قرار دارد که
نیازی به ]101۴00۲ ندارد.
صفحه 16:
استفاده از متد 9611655306
. // method code
try
{
throw new Exception( StringArgument )
۲ Pa 8
catch(Exception e)
{
String message = e.getMessage();
System. out. println (message) ;
System.exit(0);
ع ۶ 8
صفحه 17:
استفاده از متد 961۳1655306
© هر استثنا يك متغيير نمونه از نوع رشته دارد که شامل یک پیغام است.
اين بيغام دليل خطا را مشخص می کند.
#در مثال 45« gh 1 StringArgument جزء سازنده ى
«cui Exception
می توان با دستور 536 96165 ۰ 6() مقدار اين رشته را از استتای 6
استخراج کرد.
صفحه 18:
>)
حفظ خاصیت مای getMessage
# در کلاسهای استثنای تعریف شده توسط کاربر متد 6 9611165539
باید رشته ای را بر گرداند که هنگام ایجاد شی به عنوان آررگومان به شی داده
شده است.
یا اگر جز سازنده ی بدون آرگومان صدا زده شود؛ باید از پیغام پیش فرض استفاده
شود.
#اتذادر كلاسهاى احا سرين عند بويط كارين:
یک جزء سازنده وجود داشته باشد كه يك رشته بعنوان آركومان ببذيرد و بدنه ى
با فراخوانى !© (]لا5 شروع شود.
یک جزء سازنده ى بدون آركومان بايد وجود داشته باشد كه 0](©1ا5 را فراخوانى
کند.
* متد 51106۲ حتما باید یک آ رگومان از نوع رشته داشته باشد.
صفحه 19:
AProgrammer-Defined Exception
۱ Clace
Display 9.3 A Programmer-Defined Exception Class
1 public class DivisionByZeroException extends Exception
24
3 public DivisionByZeroException() You can do more in an exception
4 { constructor, but this form is common.
5 super("Division by Zero
6 1
7 public DivisionByZeroException(String message)
۲ 1 super is an invocation of the constructor for
9 super (message) ; the base class Exception,
18 1
1 [
صفحه 20:
(
نكته: كلاس استثنا مى تواند غير از رشته متغییرهای دیگری نیز
داشته باشد.
© مى توان جز سازنده اى داشت كه آركومان آن از نوع
رشته نباشد.
مقدار را در يك متغيير نمونه ذخيره مى كنيم.
براى اين متغيير -خصوصى بایدمتد دسترسی (96) را
تعريف
صفحه 21:
يك كلاس استشا با بيغام :131
‘int Message
Display 9.5 _ An Exception Class with
1 public class BadNumberException extends Exception
9 public BadNunberException()
8 4
a super("BadNunberException");
RB}
13 public BadNunberException(string message)
uf
35 super(nessag
17
8
9
20
a?
صفحه 22:
سازنده ها و استثناها
اكر يارامتر نادرستى به یک جزء سازنده ارسال شود» مى توانيم يك استشا توليد كنيم.
public class BankAccount {
private int balance;
public BankAccount( int startingBalance ) throws
Exception {
if (startingBalance < 0)
throw new
BadNumberException( startingBalance );
balance = startingBalance;
صفحه 23:
>)
ny
ng constructors
public class BankAccoun {
public static void main( String[ ] args ) {
BankAccount myAccount; // outside the try block???
try {
Scanner in = new Scanner( System.in );
System.out.print( “Input starting balance: “ );
int startBalance = in.nextInt( );
myAccount = new BankAccount( startBalance );
// more of the good stuff here
+
catch (BadNumberException bne )
// handle the bad input
System. out.println(“Deposits must be postive”);
Sysetem.out.println(“You entered “ +
bne.getBadNumber());
+
System.out.printin( “good bye “);