1 / 23

استثناء ۱

استثناء ۱. مظفر بگ محمدی دانشگاه ایلام. رسیدگی به خطاها. در یک جهان ایده آل، تمام خطاها در هنگام کامپایل کد اتفاق می افتند و رفع می شوند. لذا هنگام اجرا خطایی رخ نمی دهد. اما در واقعیت اینطور نیست. خطاها هنگام اجرای کد اتفاق می افتند و باید توسط مکانیسمی مورد رسیدگی قرار گیرند که:

nasia
Download Presentation

استثناء ۱

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. استثناء ۱ مظفر بگ محمدی دانشگاه ایلام

  2. رسیدگی به خطاها • در یک جهان ایده آل، تمام خطاها در هنگام کامپایل کد اتفاق می افتند و رفع می شوند. لذا هنگام اجرا خطایی رخ نمی دهد. اما در واقعیت اینطور نیست. • خطاها هنگام اجرای کد اتفاق می افتند و باید توسط مکانیسمی مورد رسیدگی قرار گیرند که: • به تولید کننده (یا تشخیص دهنده) ی خطا اجازه می‌دهد که اطلاعات خطا را به گیرنده ی خطا ارسال نماید و این گیرنده است که می داند با خطا چکار کند.

  3. روش رسیدگی به خطاها در C #define DEPOSIT_NEGATIVE -1 #define DEPOSIT_OK 0 intVerifyDeposit(int amount){ if (amount < 0 ) return DEPOSIT_NEGATIVE; else return DEPOSIT_OK } intdepositStatus = VerifyDeposit(amt); if (depositStatus == DEPOSIT_OK) } // do something good } else { // deal with the error }

  4. روش بهتر رسیدگی به خطا • تفکیک تشخیص خطا از رسیدگی به خطا • پیاده کننده ی کلاس خطاها را تشخیص می دهد. • کاربر کلاس تصمیم می گیرد که با خطا چکار کند. • خروج از برنامه • چاپ پیغام مناسب و ادامه ی برنامه • اجرای مجدد متد دارای خطا • سوال از کاربر • یا هر کار مناسب دیگر • کاهش پیچیدگی کد • کد عادی برنامه که اگر اتفاق ناجوری نیفتد کار خواهد کرد ، از کدی که به خطاها رسیدگی می کند جدا شده است. • زبان جاوا برنامه نویس را مجبور می کند که به خطا رسیدگی کند.

  5. try-throw-catch • روش پایه ی رسیدگی به خطاها در جاوا استفاده از سه گانه ی try-throw-catch است.

  6. مثال try-throw-catch 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 } System.out.println( “Have a nice day”);

  7. بلوک try • کدی که ممکن است استثنا تولید کند در داخل بلوک try قرار می گیرد. • بلوک try شامل کد اصلی الگوریتم یا برنامه ی کاربر است. • این بلوک روند درست انجام کار را مشخص می کند. • کدی که به خطا رسیدگی می کند در داخل بلوک catch قرار می گیرد. • بلوک catch بلافاصله بعد از بلوک try قرار دارد.

  8. مثالthrow وقتی که کد برنامه خطا را تشخیص داد یک شی از نوع استثنا را گسیل می کند. public class BankAccount { private int balance; public BankAccount( ) { balance = 0; } public intgetBalance( ) { return balance; } // precondition – amount must be nonnegative // throws an exception if amount is negative // postcondition – balance updated public int deposit( int amt ) { if (amt < 0 ) throw new Exception(“Deposit is Negative” ); balance += amt; }

  9. کد درست سپرده گذاری در بانک 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 هنگام گسیل استثنا، اجرای کد بلوک try متوقف می شود و اجرا به بلوک catch منتقل می شود. مقدار گسیل شده همان پارامتر دستور throw است و یک شی از کلاس استثنا است. بلوک catch یک پارامتر دارد که از طریق دستور throw برای آن گسیل می شود. اجرای بلوک catch همان عمل رسیدگی به استثنا است.

  11. catch( Exceptione ) { . . . } شناسه ی e در سرآیند بلوک catch همان پارامتر بلوک catchاست. پارامتر بلوک catch دو کاربرد دارد: مشخص کردن نوع استثنای گسیل شده (در مثال فوق Exception) نامگذاری استثنا (در مثال فوق همان e). می توان به جای e از هر اسم دیگری استفاده کرد. مکانیسم try-throw-catch

  12. try-catch Control Flow try { // code that might throw an Exception // more code } حالت 1 بلوک try استثنایی تولید نمی کند. بعد از اتمام اجرای بلوک try، کد بلوک catch را نادیده می گیریم. catch(Exception e) { // handle error here } // Method continues here

  13. try-catch Control Flow try { throw new Exception( “message”); // more code } حالت 2 بلوک try یک استثنا تولید می کند. اجرای بلوک try متوقف می شود. اجرای بلوک catch شروع می شود. بعد از اتمام اجرای بلوک catch، بقیه ی برنامه اجرا می شود. catch(Exception e) { // handle error here } // Method continues here

  14. کلاسهای Exception زبان جاوا کلاسی به اسم Exceptionتعریف کرده است. در کتابخانه های جاوا کلاسهای استثنای دیگری نیز وجود دارند. برنامه نویس می تواند کلاس استثنای جدیدی تعریف کند. تمام کلاسهای استثنای تعریف شده توسط جاوا دو خاصیت دارند: یک جزء سازنده دارند که آرگومان آن از نوع رشته است. یک متد به اسم getMessageدارند که رشته ی ارسال شده به کلاس استثنا در هنگام ساخت شی را بر می گرداند. کلاسهای استثنای تعریف شده توسط برنامه نویس نیز باید این خاصیتها را داشته باشند.

  15. کلاس Exception کلاس Exceptionریشه ی بقیه ی کلاسهای استثنا است. اگر چه می توان از کلاسException مستقیماً استفاده کرد، بهتر است که از این کلاس یک کلاس جدید مشتق کنیم و از آن استفاده کنیم. کلاس Exceptionدر بسته ی java.langقرار دارد که نیازی به importندارد.

  16. استفاده از متد getMessage . . . // method code try { . . . throw new Exception( StringArgument ); . . . } catch(Exception e) { String message = e.getMessage(); System.out.println(message); System.exit(0); } . . .

  17. استفاده از متد getMessage هر استثنا یک متغییر نمونه از نوع رشته دارد که شامل یک پیغام است. این پیغام دلیل خطا را مشخص می کند. در مثال قبلی، StringArgument آرگومان جزء سازنده ی Exception است. می توان با دستور e.getMessage()مقدار این رشته را از استثنای e استخراج کرد.

  18. حفظ خاصیت های getMessage در کلاسهای استثنای تعریف شده توسط کاربر، متد getMessageباید رشته ای را برگرداند که هنگام ایجاد شی به عنوان آرگومان به شی داده شده است. یا اگر جز سازنده ی بدون آرگومان صدا زده شود، باید از پیغام پیش فرض استفاده شود. لذا در کلاسهای استثنای تعریف شده توسط کاربر: باید یک جزء سازنده وجود داشته باشد که یک رشته بعنوان آرگومان بپذیرد و بدنه ی آن با فراخوانی super شروع شود. یک جزء سازنده ی بدون آرگومان باید وجود داشته باشد که super را فراخوانی کند. متد super حتما باید یک آرگومان از نوع رشته داشته باشد.

  19. A Programmer-Defined Exception Class

  20. نکته: کلاس استثنا می تواند غیر از رشته متغییرهای دیگری نیز داشته باشد. می توان جز سازنده ای داشت که آرگومان آن از نوع رشته نباشد. مقدار را در یک متغییر نمونه ذخیره می کنیم. برای این متغییر خصوصی باید متد دسترسی (get) را تعریف کنیم.

  21. یک کلاس استثنا با پیغام int

  22. سازنده ها و استثناها اگر پارامتر نادرستی به یک جزء سازنده ارسال شود، می توانیم یک استثنا تولید کنیم. public class BankAccount { private int balance; public BankAccount( int startingBalance ) { if (startingBalance < 0) throw new BadNumberException( startingBalance ); balance = startingBalance; } }

  23. trying constructors public class BankAccountDemo { 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.println( “good bye “); } }

More Related