Lecture 10 Assertions & Exceptions

Similar documents
CSE 331 Software Design & Implementation

Lecture 12 Assertions & Exceptions

CSE 331 Software Design and Implementation. Lecture 12 Assertions & Exceptions

CSE 331 Software Design and Implementation. Lecture 12 Assertions & Exceptions

Exceptions and assertions

Assertions and Exceptions Lecture 11 Fall 2005

CS 3 Introduction to Software Engineering. 3: Exceptions

Pages and 68 in [JN] conventions for using exceptions in Java. Chapter 8 in [EJ] guidelines for more effective use of exceptions.

Assertions, pre/postconditions

Programming Languages and Techniques (CIS120)

To Think About. MyClass.mogrify(new int[] { 1, 2, 4, 6 }));

Day 8. COMP1006/1406 Summer M. Jason Hinek Carleton University

ITI Introduction to Computing II

Errors and Exceptions

ITI Introduction to Computing II

Exceptions. References. Exceptions. Exceptional Conditions. CSE 413, Autumn 2005 Programming Languages

Program Correctness and Efficiency. Chapter 2

CS193j, Stanford Handout #25. Exceptions

Exceptions. Computer Science and Engineering College of Engineering The Ohio State University. Lecture 15

Programming II (CS300)

References: internet notes; Bertrand Meyer, Object-Oriented Software Construction; 10/14/2004 1

Exceptions - Example. Exceptions - Example

CS 61B Data Structures and Programming Methodology. July 7, 2008 David Sun

CS159. Nathan Sprague

About This Lecture. Outline. Handling Unusual Situations. Reacting to errors. Exceptions

Correctness and Robustness

Topic 6: Exceptions. Exceptions are a Java mechanism for dealing with errors & unusual situations

Chapter 9. Exception Handling. Copyright 2016 Pearson Inc. All rights reserved.

Exceptions. CSE 142, Summer 2002 Computer Programming 1.

Exceptions. Readings and References. Exceptions. Exceptional Conditions. Reading. CSE 142, Summer 2002 Computer Programming 1.

Assoc. Prof. Marenglen Biba. (C) 2010 Pearson Education, Inc. All rights reserved.

Object Oriented Programming

CSC207H: Software Design. Exceptions. CSC207 Winter 2018

Exceptions. CSC207 Winter 2017

Exceptions Handling Errors using Exceptions

BBM 102 Introduction to Programming II Spring Exceptions

Administration. Exceptions. Leftovers. Agenda. When Things Go Wrong. Handling Errors. CS 99 Summer 2000 Michael Clarkson Lecture 11

EXCEPTION HANDLING. Summer 2018

Exception-Handling Overview

Lecture 20. Java Exceptional Event Handling. Dr. Martin O Connor CA166

CSC System Development with Java. Exception Handling. Department of Statistics and Computer Science. Budditha Hettige

Exceptions and Testing Michael Ernst Saman Amarasinghe

ECE 122. Engineering Problem Solving with Java

Exceptions. Produced by. Algorithms. Eamonn de Leastar Department of Computing, Maths & Physics Waterford Institute of Technology

Programming II (CS300)

BBM 102 Introduction to Programming II Spring 2017

Exceptions. Examples of code which shows the syntax and all that

CS61B Lecture #12. Programming Contest: Coming up Saturday 5 October. See the contest announcement page, here.

CSCI 261 Computer Science II

Readability [Skrien 4.0] Programs must be written for people to read, and only incidentally for machines to execute.

Reminder. Topics CSE What Are Exceptions?! Lecture 11 Exception Handling

Exceptions. Produced by. Introduction to the Java Programming Language. Eamonn de Leastar

Object oriented programming. Instructor: Masoud Asghari Web page: Ch: 7

Exception Handling Generics. Amit Gupta

Internal Classes and Exceptions

Recreation. MyClass.mogrify(new int[] { 1, 2, 4, 6 }));

Defensive Programming. Ric Glassey

COMP 401 EXCEPTIONS. Instructor: Prasun Dewan

CS61B Lecture #12. Today: Various odds and ends in support of abstraction.

Programming Languages and Techniques (CIS120)

A Third Look At Java. Chapter Seventeen Modern Programming Languages, 2nd ed. 1

Exceptions. Errors and Exceptions. Dealing with exceptions. What to do about errors and exceptions

a correct statement? You need to know what the statement is supposed to do.

Good Coding Practices Spring 2018

Checked and Unchecked Exceptions in Java

Exceptions vs. Errors Exceptions vs. RuntimeExceptions try...catch...finally throw and throws

Programming Languages and Techniques (CIS120e)

Exception Handling Introduction. Error-Prevention Tip 13.1 OBJECTIVES

6.Introducing Classes 9. Exceptions

Lecture 14 Summary 3/9/2009. By the end of this lecture, you will be able to differentiate between errors, exceptions, and runtime exceptions.

Regression testing. Whenever you find a bug. Why is this a good idea?

Chapter 13 Exception Handling

Exception Handling. Sometimes when the computer tries to execute a statement something goes wrong:

Exceptions. What exceptional things might our programs run in to?

Exception Handling. Run-time Errors. Methods Failure. Sometimes when the computer tries to execute a statement something goes wrong:

CS 315 Software Design Homework 3 Preconditions, Postconditions, Invariants Due: Sept. 29, 11:30 PM

Exceptions in Java

Defensive Programming

COMP1008 Exceptions. Runtime Error

CMSC131. Exceptions and Exception Handling. When things go "wrong" in a program, what should happen.

Administrivia. CPSC Winter 2008 Term 1. Department of Computer Science Undergraduate Events

Exception Handling. Chapter 11. Outline. Example: The Quotient app What Are Exceptions? Java By Abstraction Chapter 11

Introduction to Computation and Problem Solving. Class 25: Error Handling in Java. Prof. Steven R. Lerman and Dr. V. Judson Harward.

Why Design by Contract! CS 619 Introduction to OO Design and Development. Design by Contract. Fall 2012

ASSERTIONS AND LOGGING

Java Loose Ends. 11 December 2017 OSU CSE 1

CS112 Lecture: Exceptions and Assertions

EXCEPTION-HANDLING INTRIVIEW QUESTIONS

CS S-22 Exceptions 1. Running a web server, don t want one piece of bad data to bring the whole thing down

COMP 401 EXCEPTIONS. Instructor: Prasun Dewan

Assertions. Assertions - Example

Preconditions. CMSC 330: Organization of Programming Languages. Signaling Errors. Dealing with Errors

What are Exceptions?

Software Construction

EXCEPTIONS. Prof. Chris Jermaine

Testing. UW CSE 160 Winter 2016

Introduction. Exceptions: An OO Way for Handling Errors. Common Runtime Errors. Error Handling. Without Error Handling Example 1

COE318 Lecture Notes Week 10 (Nov 7, 2011)

Steps for project success. git status. Milestones. Deliverables. Homework 1 submitted Homework 2 will be posted October 26.

2IP15 Programming Methods

Transcription:

CSE 331 Software Design and Implementation OUTLINE Lecture 10 Assertions & Exceptions Zach Tatlock / Winter 2016 Exceptions: what, how in Java How to throw, catch, and declare exceptions Failure happens! Failure causes In 2000 there were reports that transient faults caused crashes at a number of Sun s major customer sites, including America Online and ebay. Later, Hewlett Packard admitted multiple problems in the Los Alamos Labs supercomputers due to transient faults. Finally, Cypress Semiconductor has confirmed The wake-up call came in the end of 2001 with a major customer reporting havoc at a large telephone company. Technically, it was found that a single soft fail... was causing an interleaved system farm to crash. Fault-tolerant Typed Assembly Language -- Walker et al. Partial failure is inevitable Goal: prevent complete failure Structure your code to be reliable and understandable Some failure causes: 1. Misuse of your code Precondition violation 2. Errors in your code Bugs, representation exposure, 3. Unpredictable external problems Out of memory, missing file,

What to do when something goes wrong Avoiding errors Fail early, fail friendly Goal 1: Give information about the problem To the programmer a good error message is key! To the client code: via exception or return-value or Goal 2: Prevent harm Abort: inform a human Perform cleanup actions, log the error, etc. Re-try: Problem might be transient Skip a subcomputation: Permit rest of program to continue Fix the problem? Usually infeasible to repair from an unexpected state A precondition prohibits misuse of your code Adding a precondition weakens the spec This ducks the problem of errors-will-happen Mistakes in your own code Misuse of your code by others Removing a precondition requires specifying more behavior Often a good thing, but there are tradeoffs Strengthens the spec Example: specify that an exception is thrown OUTLINE Exceptions: what, how How to throw, catch, and declare exceptions in Java Defensive programming Check: Precondition Postcondition Representation invariant Other properties that you know to be true Check statically via reasoning and tools Check dynamically via assertions assert index >= 0; assert items!= null : "null item list argument" assert size % 2 == 0 : "Bad size for " + tostring(); Write assertions as you write code Include descriptive messages

Enabling assertions When not to use assertions In Java, assertions can be enabled or disabled at runtime without recompiling Command line: java ea runs code with assertions enabled java runs code with assertions disabled (default) Eclipse: Select Run>Run Configurations then add -ea to VM arguments under (x)=arguments tab Don t clutter the code with useless, distracting repetition x = y + 1; assert x == y + 1; Don t perform side effects assert list.remove(x); // won t happen if disabled // Better: boolean found = list.remove(x); assert found; (These tool details were covered in section already) Turn them off in rare circumstances (production code(?) ) Most assertions better left enabled Don t go to sea without your lifejacket! Finally, it is absurd to make elaborate security checks on debugging runs, when no trust is put in the results, and then remove them in production runs, when an erroneous result could be expensive or disastrous. What would we think of a sailing enthusiast who wears his lifejacket when training on dry land, but takes it off as soon as he goes to sea? Hints on Programming Language Design -- C.A.R. Hoare assert and checkrep() CSE 331 s checkrep() is another dynamic check Strategy: use assert in checkrep() to test and fail with meaningful traceback/message if trouble found Be sure to enable asserts when you do this! Asserts should be enabled always for CSE 331 projects We will enable them for grading

Expensive checkrep()tests Square root Detailed checks can be too slow in production But complex tests can be very helpful, particularly during testing/debugging (let the computer find problems for you!) No perfect answers; suggested strategy for checkrep: Create a static, global debug or debuglevel variable Run expensive tests when this is enabled Turn it off in graded / production code if tests are too expensive // requires: x 0 // returns: approximation to square root of x public double sqrt(double x) {... Often helpful: put expensive / complex tests in separate methods and call as needed Square root with assertion // requires: x 0 // returns: approximation to square root of x public double sqrt(double x) { assert (x >= 0.0); double result; compute result assert (Math.abs(result*result x) <.0001); return result; These two assertions serve very different purposes (Note: the Java library Math.sqrt method returns NaN for x<0. We use different specifications in this lecture as examples.) OUTLINE Exceptions: what, how How to throw, catch, and declare exceptions in Java

Square root, specified for all inputs Using try-catch to handle exceptions // throws: IllegalArgumentException if x < 0 // returns: approximation to square root of x public double sqrt(double x) throws IllegalArgumentException { if (x < 0) throw new IllegalArgumentException(); throws is part of a method signature: it might happen Comma-separated list throw is a statement that actually causes exception-throw Immediate control transfer [like return but different] public double sqrt(double x) throws IllegalArgumentException Client code: y = sqrt( ); catch (IllegalArgumentException e) { e.printstacktrace(); //and/or take other actions Handled by nearest dynamically enclosing try/catch Top-level default handler: stack trace, program terminates Throwing and catching Catching with inheritance Executing program has a stack of currently executing methods Dynamic: reflects runtime order of method calls No relation to static nesting of classes, packages, etc. When an exception is thrown, control transfers to nearest method with a matching catch block If none found, top-level handler prints stack trace and terminates Exceptions allow non-local error handling A method many levels up the stack can handle a deep error code catch (FileNotFoundException fnfe) { code to handle a file not found exception catch (IOException ioe) { code to handle any other I/O exception catch (Exception e) { code to handle any other exception A SocketException would match the second block An ArithmeticException would match the third block Subsequent catch blocks need not be supertypes like this

Exception Hierarchy Java s checked/unchecked distinction Checked exceptions (style: for special cases) Callee: Must declare in signature (else type error) Client: Must either catch or declare (else type error) Even if you can prove it will never happen at run time, the type system does not believe you There is guaranteed to be a dynamically enclosing catch Unchecked exceptions (style: for never-expected) Library: No need to declare Client: No need to catch Subclasses of RuntimeException and Error Exception Checked exceptions Throwable Runtime Exception Error Checked vs. unchecked The finally block No perfect answer to should possible exceptions thrown be part of a method signature So Java provided both Advantages to checked exceptions: Static checking of callee ensures no other checked exceptions get thrown Static checking of caller ensures caller does not forget to check Disadvantages: Impedes implementations and overrides Often in your way when prototyping Have to catch or declare even in clients where the exception is not possible finally block is always executed Whether an exception is thrown or not code catch (Type name) { code to handle the exception finally { code to run after the try or catch finishes

What finally is for finally is used for common must-always-run or clean-up code Avoids duplicated code in catch branch[es] and after Avoids having to catch all exceptions //... write to out; might throw exception catch (IOException e) { System.out.println("Caught IOException: " + e.getmessage()); finally { out.close(); OUTLINE Exceptions: what, how in Java How to throw, catch, and declare exceptions Propagating an exception Why catch exceptions locally? // returns: x such that ax^2 + bx + c = 0 // throws: IllegalArgumentException if no real soln exists double solvequad(double a, double b, double c) throws IllegalArgumentException { // No need to catch exception thrown by sqrt return (-b + sqrt(b*b - 4*a*c)) / (2*a); Failure to catch exceptions usually violates modularity Call chain: A IntegerSet.insert IntegerList.insert IntegerList.insert throws some exception Implementer of IntegerSet.insert knows how list is being used Implementer of A may not even know that IntegerList exists Method on the stack may think that it is handling an exception raised by a different call Aside: How can clients know if a set of arguments to solvequad is illegal? Better alternative: catch it and throw again chaining or translation Do this even if the exception is better handled up a level Makes it clear to reader of code that it was not an omission

Exception translation // returns: x such that ax^2 + bx + c = 0 // throws: NotRealException if no real solution exists double solvequad(double a, double b, double c) throws NotRealException { return (-b + sqrt(b*b - 4*a*c)) / (2*a); catch (IllegalArgumentException e) { throw new NotRealException(); // chaining class NotRealException extends Exception { NotRealException() { super(); NotRealException(String message) { super(message); NotRealException(Throwable cause) { super(cause); NotRealException(String msg, Throwable c) { super(msg, c); Exceptions as non-local control flow void compile() { parse(); typecheck(); optimize(); generate(): catch (RuntimeException e) { Logger.log("Failed: " + e.getmessage()); Not common usually bad style, particularly at small scale Java/C++, etc. exceptions are expensive if thrown/caught Reserve exceptions for exceptional conditions Two distinct uses of exceptions Handling exceptions Failures Unexpected Should be rare with well-written client and library Can be the client s fault or the library s Usually unrecoverable Special results Expected but not the common case Unpredictable or unpreventable by client Failures Usually can t recover If condition not checked, exception propagates up the stack The top-level handler prints the stack trace Unchecked exceptions the better choice (else many methods have to declare they could throw it) Special results Take special action and continue computing Should always check for this condition Should handle locally by code that knows how to continue Checked exceptions the better choice (encourages local handling)

Don t ignore exceptions Effective Java Tip #65: Don't ignore exceptions Empty catch block is (common) poor style often done to get code to compile despite checked exceptions Worse reason: to silently hide an error readfile(filename); catch (IOException e) { // silent failure At a minimum, print out the exception so you know it happened And exit if that s appropriate for the application catch (IOException e) { e.printstacktrace(); System.exit(1); OUTLINE Exceptions: what, how in Java How to throw, catch, and declare exceptions Informing the client of a problem Special value: null for Map.get -1 for indexof NaN for sqrt of negative number Advantages: For a normal-ish, common case, it is the result Less verbose clients than try/catch machinery Disadvantages: Error-prone: Callers forget to check, forget spec, etc. Need extra result: Doesn t work if every result could be real Example: if a map could store null keys Has to be propagated manually one call at a time General Java style advice: Exceptions for exceptional conditions Up for debate if indexof not-present-value is exceptional Special values in C/C++/others For errors and exceptional conditions in Java, use exceptions! But C doesn t have exceptions and some C++ projects avoid them Over decades, a common idiom has emerged Error-prone but you can get used to it L Affects how you read code Put results in out-parameters Result is a boolean (int in C) to indicate success or failure type result; if(!computesomething(&result)) { return 1; // no "exception", use result Bad, but less bad than error-code-in-global-variable

OUTLINE Exceptions: what, how in Java How to throw, catch, and declare exceptions Exceptions: review Use an exception when Used in a broad or unpredictable context Checking the condition is feasible Use a precondition when Checking would be prohibitive E.g., requiring that a list be sorted Used in a narrow context in which calls can be checked Use a special value when It is a reasonable common-ish situation Clients are likely (?) to remember to check for it Use an assertion for internal consistency checks that should not fail Exceptions: review, continued Use checked exceptions most of the time Static checking is helpful But maybe avoid checked exceptions if possible for many callers to guarantee exception cannot occur Handle exceptions sooner rather than later Not all exceptions are errors Example: File not found Good reference: Effective Java, Chapter 9 A whole chapter? Exception-handling design matters!