C# Exception handling. Handling Errors during the Program Execution

Содержание

Слайд 2

Agenda What are Exceptions? Handling Exceptions The System.Exception Class Types of

Agenda

What are Exceptions?
Handling Exceptions
The System.Exception Class
Types of Exceptions and their Hierarchy
Raising

(Throwing) Exceptions
Best Practices
Слайд 3

What are Exceptions? The exceptions in .NET Framework are classic implementation

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

Handling Exceptions In C# the exceptions can be handled by the

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

try
{
// Do some work that can raise an exception
}
catch (DivideByZeroException ex)
{
// Handle the caught DivideByZeroException ex
}
Catch (Exeption ex)
{
// Handle the caught Exception ex
}

Слайд 5

Handling Exceptions – Example static void Main() { string s =

Handling Exceptions – Example

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!");
}
}
Слайд 6

The System.Exception Class Exception is a base class for all exceptions

The System.Exception Class

Exception is a base class for all exceptions
Important properties:
Message

– user-oriented message about error
Source – name of an error source (application or object)
InnerException – inner exception (if called from other)
StackTrace – call stack to the point of exception call
TargetSite – method name which raised an exception
HelpLink – URL-address to information about exception
Data – dictionary with additional information with exception (IDictionary)
Слайд 7

Exception Properties – Example class ExceptionsExample { public static void CauseFormatException()

Exception Properties – Example

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);
}
}
}
Слайд 8

Exception Properties The Message property gives brief description of the problem

Exception Properties

The Message property gives brief description of the problem
The StackTrace

property is extremely useful when identifying the reason caused the exception

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

Слайд 9

Exception Properties (2) File names and line numbers are accessible only

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:

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)

Слайд 10

Exception Hierarchy Exceptions in .NET Framework are organized in a hierarchy

Exception Hierarchy

Exceptions in .NET Framework are organized in a hierarchy

Слайд 11

Types of Exceptions .NET exceptions inherit from System.Exception The system exceptions

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
Слайд 12

Handling Exceptions When catching an exception of a particular class, all

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

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

Слайд 13

Find the Mistake! static void Main() { string s = Console.ReadLine();

Find the Mistake!

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

Слайд 14

Handling All Exceptions All exceptions thrown by .NET managed code inherit

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:

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

Слайд 15

Throwing Exceptions Exceptions are thrown (raised) by throw keyword in C#

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
Слайд 16

How Exceptions Work? Main() Method 1 Method 2 Method N 2.

How Exceptions Work?

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 the
program

9. Find handler

10. Display error message

Слайд 17

Using throw Keyword Throwing an exception with an error message: Exceptions

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

throw new ArgumentException("Invalid amount!");

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

Слайд 18

Re-Throwing Exceptions Caught exceptions can be re-thrown again: try { Int32.Parse(str);

Re-Throwing Exceptions

Caught exceptions can be re-thrown again:

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
}

Слайд 19

Throwing Exceptions – Example public static double Sqrt(double value) { if

Throwing Exceptions – Example

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;
}
}
Слайд 20

Choosing the Exception Type When an invalid parameter is passed to

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)
Слайд 21

The try-finally Statement The statement: Ensures execution of given block in

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

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

Слайд 22

try-finally – Example static void TestTryFinally() { Console.WriteLine("Code executed before try-finally.");

try-finally – Example

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.");
}
Слайд 23

Exceptions – Best Practices catch blocks should begin with the exceptions

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)!
Слайд 24

Exceptions – Best Practices (2) When raising an exception always pass

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"
Слайд 25

Exceptions – Best Practices (3) Exceptions can decrease the application performance

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.OutOfMemoryException
Слайд 26

Summary Exceptions provide flexible error handling mechanism in .NET Framework Allow

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)