-----------------------------------------------------------------------------
Kết qu:
Open file here
DivideByZeroExceptión Msg: Attempted to divide by zero
HelpLink: http://www.hcmuns.edu.vn
Here’s a stack trace:
at Programming_CSharp.Test.DoDivide(Double c, Double b)
in c:\...exception06.cs: line 56
at Programming_CSharp.Test.TestFunc() in ...exception06.cs: line 22. Close file
here
-----------------------------------------------------------------------------
Trong đon kết qu trên, danh sách trace ca stack được hin th theo th t ngược li
th t gi. Nó hin th mt li trong phương thc DoDivde(), phương thc này được
gi t phương thc TestFunc(). Khi các phương thc gi lng nhau nhiu cp, thông
tin stack có th giúp chúng ta hiu th t ca các phương thc được gi.
Trong ví d này, hơn là vic đơn gin phát sinh mt DidiveByZeroException, chúng
ta to mt th hn mi ca ngoi l:
DivideByZeroException e = new DivideByZeroException();
Chúng ta không truyn vào thông đip ca chúng ta, nên thông đip mc định s được
in ra:
DivideByZeroException! Msg: Attemped to divide by zero.
đây chúng ta có th b sung như dòng lnh bên dưới để truyn vào thông đip ca
chúng ta tùy chn như sau:
new DivideByZeroException(“You tried to divide by zero which is not
meaningful”);
Trước khi phát sinh ra ngoi l, chúng ta thiết lp thuc tính HelpLink như sau:
e.HelpLink = “http://www.hcmunc.edu.vn”;
Khi ngoi l được bt gi, chương trình s in thông đip và HelpLink ra màn hình:
catch (System.DivideByZeroException e)
{
Console.WriteLine(“\nDivideByZeroException! Msg: {0}”,
e.Message); Console.WriteLine(“\nHelpLink: {0}”, e.HelpLink);
}
Vic làm này cho phép chúng ta cung cp nhng thông tin hu ích cho người s
dng. Thêm vào đó thông tin stack cũng được đưa ra bng cách s dng thuc tính
StackTrace ca đối tượng ngoi l:
Console.WriteLine(“\n Here’s a stack trace: {0}\n”, e.StackTrace);
Kết qu là các vết trong stack s được xut ra:
Here’s a stack trace:
at Programming_CSharp.Test.DoDivide(Double c, Double b)
in c:\...exception06.cs: line 56
at Programming_CSharp.Test.TestFunc() in ...exception06.cs: line 22.
Lưu ý rng, phn đường dn được viết tt, do đó kết qu ca bn có th hơi khác mt tí.
Bng 13.1 sau t mt s các lp ngoi l chung được khai báo bên trong
namespace
System.
CÁC LP NGOI
L
Tên ngoi l Mô t
MethodAccessException Li truy cp, do truy cp đến thành viên
hay phương thc không được truy cp
ArgumentException Li tham s đối mc
ArgumentNullException Đối mc Null, phương thc được truyn đối
mc null không được chp nhn
A
r
i
t
hmeticException Li liên quan đến các phép toán
ArrayTypeMismatchException Kiu mng không hp, khi c lưu tr kiu
không thích hp vào mng
Divi
d
eByZe
r
oExce
p
tion Li chia zero
FormatException Định dng không chính xác mt đối mc nào đó
IndexOutOfRangeException Ch s truy cp mng không hp l, dùng nh
hơn ch s nh nht hay ln hơn ch s ln
nht ca mng
InvalidCas
t
Exce
p
tion Phép gán không hp l
MulticastNotSupportedException Multicast không được h tr, do vic kết hp
hai delegate không đúng
No
t
FiniteNu
m
b
e
r
Exception Không phi s hu hn, s không hp l
NotSupportedException Phương thc không h tr, khi gi mt
phương thc không tn ti bên trong lp.
NullRefe
r
enceExce
p
tion Tham chiếu null không hp l.
OutOfMe
m
o
yException Out of memory
Ove
r
flowException Li tràn phép toán
StackOverflowExce
p
tion Tràn stack
Ty
p
eInitializationExce
p
tion Kiu khi to sai, khi b khi dng tĩnh có li.
Bng 13.1 : Các ngoi l thường xut hin
To riêng các ngoi l
CLR cung cp nhng kiu d liu ngoi l cơ bn, trong ví d trước chúng ta đã to mt
vài các kiu ngoi l riêng. Thông thường chúng ta cn thiết phi cung cp các thông tin
m rng cho khi catch khi mt ngoi l đưc phát sinh. Tuy nhiên, nhng lúc
chúng ta mun cung cp nhiu thông tin m rng hay là các kh năng đặc bit cn thiết
trong ngoi l chúng ta to ra. Chúng ta d dàng to ra các ngoi l riêng, hay còn gi
là các ngoi ly chn (custom exception), điu bt buc vi các ngoi l này là chúng
phi được dn xut t System.ApplicationException. Ví d 13.7 sau minh ha vic to
mt ngoi l riêng.
Ví d: To mt ngoi l riêng.
-----------------------------------------------------------------------------
namespace Programming_CSharp
{
using System;
// to ngoi l riêng
public class MyCustomException : System.ApplicationException
{
public MyCustomException( string message): base(message)
{
}
}
public class Test
{
public static void Main()
{
Test t = new Test();
t.TestFunc();
}
// chia hai s và x lý ngoi l
public void TestFunc()
{
try
{
}
Console.WriteLine(“Open file here”);
double a = 0;
double b = 5;
Console.WriteLine(“{0} /{1} = {2}”, a, b,
DoDivide(a,b)); Console.WriteLine(“This line may or not
print”);
catch (System.DivideByZeroException e)
{
Console.WriteLine(“\nDivideByZeroException! Msg: {0}”, e.Message);
Console.WriteLine(“\nHelpLink: {0}”, e.HelpLink);
}
catch (MyCustomException e)
{
Console.WriteLine(“\nMyCustomException! Msg: {0}”,
e.Message); Console.WriteLine(“\nHelpLink: {0}”, e.HelpLink);
}
catch
{
Console.WriteLine(“Unknown excepiton caught”);
}
finally
{
Console.WriteLine(“Close file here.”);
}
}
// thc hin phép chia hp l
public double DoDivide( double a, double b)
{
if ( b == 0)
{
DivideByZeroException e = new DivideByZeroException();
e.HelpLink = “http://www.hcmunc.edu.vn”;
throw e;
}
if ( a == 0)
{
divisor”);
}
MyCustomException e = new MyCustomException(“Can’t have zero
e.HelpLink = “http://www.hcmuns.edu.vn”;
throw e;
return a/b;
}
}
-----------------------------------------------------------------------------