15. Exceptions Handling - C# Fundamentals

40
Exceptions Handling Handling Errors during the Program Execution Svetlin Nakov Telerik Software Academy academy.telerik.com Manager Technical trainer www.nakov.com http://csharpfundamentals.telerik.com

description

In this presentation, part of the C# Fundamentals course, we discuss exceptions.Telerik Academy http://csharpfundamentals.telerik.comThe website and all video materials are in Bulgarian.Main topics:How to handle the exception. How to throw the exception. Best practices. Types of Exceptions and their Hierarchy.Telerik Software Academy: http://www.academy.telerik.comThe website and all video materials are in BulgarianWhat are Exceptions; Handling Exceptions;The System.Exception Class; Types of Exceptions and their Hierarchy;Raising (Throwing) Exceptions; Best Practices;

Transcript of 15. Exceptions Handling - C# Fundamentals

Page 1: 15. Exceptions Handling - C# Fundamentals

Exceptions HandlingHandling Errors during the Program Execution

Svetlin Nakov

Telerik Software Academyacademy.telerik.com

Manager Technical trainerwww.nakov.com

http://csharpfundamentals.telerik.com

Page 2: 15. Exceptions Handling - C# Fundamentals

Table of Contents1. What are Exceptions?

2. Handling Exceptions

3. The System.Exception Class

4. Types of Exceptions and their Hierarchy

5. Raising (Throwing) Exceptions

6. Best Practices

2

Page 3: 15. Exceptions Handling - C# Fundamentals

What are Exceptions?The Paradigm of Exceptions in

OOP

Page 4: 15. Exceptions Handling - C# Fundamentals

What are Exceptions? The exceptions in .NET Framework are classic implementation of the OOP exception model

Deliver powerful mechanism for centralized handling of errors and unusual events

Substitute procedure-oriented approach, in which each function returns error code

Simplify code construction and maintenance

Allow the problematic situations to be processed at multiple levels

4

Page 5: 15. Exceptions Handling - C# Fundamentals

Handling Exceptions

Catching and Processing Errors

Page 6: 15. Exceptions Handling - C# Fundamentals

Handling Exceptions In C# the exceptions can be handled by the try-catch-finally construction

catch blocks can be used multiple times to process different exception types 6

try{ // Do some work that can raise an exception}catch (SomeException){ // Handle the caught exception}

Page 7: 15. Exceptions Handling - C# Fundamentals

Handling Exceptions – Example

7

static void Main(){ string s = Console.ReadLine(); try { Int32.Parse(s); Console.WriteLine( "You entered valid Int32 number {0}.", s); } catch (FormatException) { Console.WriteLine("Invalid integer number!"); } catch (OverflowException) { Console.WriteLine( "The number is too big to fit in Int32!"); }}

Page 8: 15. Exceptions Handling - C# Fundamentals

Handling

ExceptionsLive Demo

Page 9: 15. Exceptions Handling - C# Fundamentals

The System.Exception Class

Exceptions in .NET are objects The System.Exception class is base for

all exceptions in CLR Contains information for the cause of

the error / unusual situation Message – text description of the

exception

StackTrace – the snapshot of the stack at the moment of exception throwing

InnerException – exception caused the currentexception (if any) 9

Page 10: 15. Exceptions Handling - C# Fundamentals

Exception Properties – Example

10

class ExceptionsExample{ public static void CauseFormatException() { string s = "an invalid number"; Int32.Parse(s); } static void Main() { try { CauseFormatException(); } catch (FormatException fe) { Console.Error.WriteLine("Exception: {0}\n{1}", fe.Message, fe.StackTrace); } }}

Page 11: 15. Exceptions Handling - C# Fundamentals

Exception Properties The Message property gives brief

description of the problem The StackTrace property is extremely

useful when identifying the reason caused the exception

The Message property gives brief description of the problem

The StackTrace property is extremely useful when identifying the reason caused the exception

11

Exception caught: Input string was not in a correct format. at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info) at System.Int32.Parse(String s) at ExceptionsTest.CauseFormatException() in c:\consoleapplication1\exceptionstest.cs:line 8 at ExceptionsTest.Main(String[] args) in c:\consoleapplication1\exceptionstest.cs:line 15

Page 12: 15. Exceptions Handling - C# Fundamentals

Exception Properties (2)

File names and line numbers are accessible only if the compilation was in Debug mode

When compiled in Release mode, the information in the property StackTrace is quite different:

File names and line numbers are accessible only if the compilation was in Debug mode

When compiled in Release mode, the information in the property StackTrace is quite different:

12

Exception caught: Input string was not in a correct format. at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info) at ExceptionsTest.Main(String[] args)

Page 13: 15. Exceptions Handling - C# Fundamentals

Exception PropertiesLive Demo

Page 14: 15. Exceptions Handling - C# Fundamentals

The Hierarchy of Exceptions

Page 15: 15. Exceptions Handling - C# Fundamentals

Exception Hierarchy

Exceptions in .NET Framework are organized in a hierarchy

15

System.Exception

System.SystemException System.ApplicationException

System.NullReferenceException System.FormatException

System.ArithmeticException

System.DivideByZeroException System.OverflowException

SofiaUniversity.InvalidStudentException

Page 16: 15. Exceptions Handling - C# Fundamentals

Types of Exceptions

.NET exceptions inherit from System.Exception

The system exceptions inherit from System.SystemException, e.g.

System.ArgumentException

System.NullReferenceException

System.OutOfMemoryException

System.StackOverflowException

User-defined exceptions should inherit from System.ApplicationException

16

Page 17: 15. Exceptions Handling - C# Fundamentals

Handling Exceptions

When catching an exception of a particular class, all its inheritors (child exceptions) are caught too

Example:

Handles ArithmeticException and its descendants DivideByZeroException and OverflowException

17

try{ // Do some works that can cause an exception}catch (System.ArithmeticException){ // Handle the caught arithmetic exception}

Page 18: 15. Exceptions Handling - C# Fundamentals

Find the Mistake!

18

static void Main(){ string s = Console.ReadLine(); try { Int32.Parse(s); } catch (Exception) { Console.WriteLine("Can not parse the number!"); } catch (FormatException) { Console.WriteLine("Invalid integer number!"); } catch (OverflowException) { Console.WriteLine( "The number is too big to fit in Int32!"); }}

This should be last

Unreachable code

Unreachable code

Page 19: 15. Exceptions Handling - C# Fundamentals

Handling All Exceptions

All exceptions thrown by .NET managed code inherit the System.Exception exception

Unmanaged code can throw other exceptions

For handling all exceptions (even unmanaged) use the construction:

19

try{ // Do some works that can raise any exception}catch{ // Handle the caught exception}

Page 20: 15. Exceptions Handling - C# Fundamentals

Throwing Exceptions

Page 21: 15. Exceptions Handling - C# Fundamentals

Throwing Exceptions

Exceptions are thrown (raised) by throw keyword in C# Used to notify the calling code in case of error or unusual situation

When an exception is thrown: The program execution stops The exception travels over the

stack until a suitable catch block is reached to handle it

Unhandled exceptions display error message

21

Page 22: 15. Exceptions Handling - C# Fundamentals

How Exceptions Work?

22

Main()

Method 1

Method 2

Method N

2. Method call

3. Method call

4. Method call…

Main()

Method 1

Method 2

Method N

8. Find handler

7. Find handler

6. Find handler…

5. Throw an exception

.NET CLR

1. Execute theprogram 9. Find handler

10. Display error message

Page 23: 15. Exceptions Handling - C# Fundamentals

Using throw Keyword Throwing an exception with an error

message:

Exceptions can accept message and cause:

Note: if the original exception is not passed the initial cause of the exception is lost

23

throw new ArgumentException("Invalid amount!");

try{ Int32.Parse(str);}catch (FormatException fe){ throw new ArgumentException("Invalid number", fe);}

Page 24: 15. Exceptions Handling - C# Fundamentals

Re-Throwing Exceptions Caught exceptions can be re-thrown again:

24

try{ Int32.Parse(str);}catch (FormatException fe){ Console.WriteLine("Parse failed!"); throw fe; // Re-throw the caught exception}

catch (FormatException){ throw; // Re-throws the last caught exception}

Page 25: 15. Exceptions Handling - C# Fundamentals

Throwing Exceptions – Example

25

public static double Sqrt(double value){ if (value < 0) throw new System.ArgumentOutOfRangeException( "Sqrt for negative numbers is undefined!"); return Math.Sqrt(value);}

static void Main(){ try { Sqrt(-1); } catch (ArgumentOutOfRangeException ex) { Console.Error.WriteLine("Error: " + ex.Message); throw; }}

Page 26: 15. Exceptions Handling - C# Fundamentals

Throwing Exceptions

Live Demo

Page 27: 15. Exceptions Handling - C# Fundamentals

Choosing the Exception Type

When an invalid parameter is passed to a method: ArgumentException, ArgumentNullException, ArgumentOutOfRangeException

When requested operation is not supported NotSupportedException

When a method is still not implemented NotImplementedException

If no suitable standard exception class is available Create own exception class (inherit Exception)

27

Page 28: 15. Exceptions Handling - C# Fundamentals

Using Try-Finally Blocks

Page 29: 15. Exceptions Handling - C# Fundamentals

The try-finally Statement

The statement:

Ensures execution of given block in all cases When exception is raised or not in the try block

Used for execution of cleaning-up code, e.g. releasing resources

29

try{ // Do some work that can cause an exception}finally{ // This block will always execute}

Page 30: 15. Exceptions Handling - C# Fundamentals

try-finally – Example

30

static void TestTryFinally(){ Console.WriteLine("Code executed before try-finally."); try { string str = Console.ReadLine(); Int32.Parse(str); Console.WriteLine("Parsing was successful."); return; // Exit from the current method } catch (FormatException) { Console.WriteLine("Parsing failed!"); } finally { Console.WriteLine( "This cleanup code is always executed."); } Console.WriteLine( "This code is after the try-finally block.");}

Page 31: 15. Exceptions Handling - C# Fundamentals

Try-FinallyLive Demo

Page 32: 15. Exceptions Handling - C# Fundamentals

Exceptions: Best Practices

Page 33: 15. Exceptions Handling - C# Fundamentals

Exceptions – Best Practices

catch blocks should begin with the exceptions lowest in the hierarchy And continue with the more general

exceptions Otherwise a compilation error will

occur Each catch block should handle only these exceptions which it expects If a method is not competent to

handle an exception, it should be left unhandled

Handling all exceptions disregarding their type is popular bad practice (anti-pattern)!

33

Page 34: 15. Exceptions Handling - C# Fundamentals

Exceptions – Best Practices (2)

When raising an exception always pass to the constructor good explanation message

When throwing an exception always pass a good description of the problem Exception message should explain

what causes the problem and how to solve it

Good: "Size should be integer in range [1…15]"

Good: "Invalid state. First call Initialize()"

Bad: "Unexpected error" Bad: "Invalid argument"

34

Page 35: 15. Exceptions Handling - C# Fundamentals

Exceptions – Best Practices (3)

Exceptions can decrease the application performance

Throw exceptions only in situations which are really exceptional and should be handled

Do not throw exceptions in the normal program control flow (e.g. for invalid user input)

CLR could throw exceptions at any time with no way to predict them

E.g. System.OutOfMemoryException35

Page 36: 15. Exceptions Handling - C# Fundamentals

Summary Exceptions provide flexible error handling mechanism in .NET Framework Allow errors to be handled at

multiple levels Each exception handler processes

only errors of particular type (and its child types) Other types of errors are processed

by some other handlers later

Unhandled exceptions cause error messages

Try-finally ensures given code block is always executed (even when an exception is thrown)

36

Page 37: 15. Exceptions Handling - C# Fundamentals

форум програмиране, форум уеб дизайнкурсове и уроци по програмиране, уеб дизайн – безплатно

програмиране за деца – безплатни курсове и уроцибезплатен SEO курс - оптимизация за търсачки

уроци по уеб дизайн, HTML, CSS, JavaScript, Photoshop

уроци по програмиране и уеб дизайн за ученициASP.NET MVC курс – HTML, SQL, C#, .NET, ASP.NET MVC

безплатен курс "Разработка на софтуер в cloud среда"

BG Coder - онлайн състезателна система - online judge

курсове и уроци по програмиране, книги – безплатно от Наков

безплатен курс "Качествен програмен код"

алго академия – състезателно програмиране, състезания

ASP.NET курс - уеб програмиране, бази данни, C#, .NET, ASP.NETкурсове и уроци по програмиране – Телерик академия

курс мобилни приложения с iPhone, Android, WP7, PhoneGap

free C# book, безплатна книга C#, книга Java, книга C#Дончо Минков - сайт за програмиранеНиколай Костов - блог за програмиранеC# курс, програмиране, безплатно

?

? ? ??

?? ?

?

?

?

??

?

?

? ?

Questions?

?

Exceptions Handling

http://academy.telerik.com

37

Page 38: 15. Exceptions Handling - C# Fundamentals

Exercises1. Write a program that reads an integer

number and calculates and prints its square root. If the number is invalid or negative, print "Invalid number". In all cases finally print "Good bye". Use try-catch-finally.

2. Write a method ReadNumber(int start, int end) that enters an integer number in given range [start…end]. If an invalid number or non-number text is entered, the method should throw an exception. Using this method write a program that enters 10 numbers:

a1, a2, … a10, such that 1 < a1 < … < a10 < 100

38

Page 39: 15. Exceptions Handling - C# Fundamentals

Exercises (2)3. Write a program that enters file name

along with its full file path (e.g. C:\WINDOWS\win.ini), reads its contents and prints it on the console. Find in MSDN how to use System.IO.File.ReadAllText(…). Be sure to catch all possible exceptions and print user-friendly error messages.

4. Write a program that downloads a file from Internet (e.g. http://www.devbg.org/img/Logo-BASD.jpg) and stores it the current directory. Find in Google how to download files in C#. Be sure to catch all exceptions and to free any used resources in the finally block.

39

Page 40: 15. Exceptions Handling - C# Fundamentals

Free Trainings @ Telerik Academy

Fundamentals of C# ProgrammingCourse csharpfundamentals.telerik.com

Telerik Software Academy academy.telerik.com

Telerik Academy @ Facebook facebook.com/TelerikAcademy

Telerik Software Academy Forums forums.academy.telerik.com