Exception

Exception คือคุณสมบัติในภาษา Visual Basic ที่ให้คุณสามารถจัดการกับข้อผิดพลาดที่ไม่คาดฝันที่อาจจะเกิดขึ้นในขณะที่โปรแกรมกำลังทำงาน โดยการทำงานของ Exception นั้นจะช่วยให้โปรแกรมไม่ Error หรือหยุดการทำงานเมื่อเกิดข้อผิดพลาดขึ้น

ในการจัดการ Exception จะใช้คำสั่ง Try สำหรับตรวจจับข้อผิดพลาด คำสั่ง Catch สำหรับจัดการกับข้อผิดพลาดที่เกิดขึ้น ซึ่งการทำงานก็คือเมื่อเกิดขึ้น Exception ขึ้นในบล็อคของคำสั่ง Try โปรแกรมจะหยุดการทำงานในบล็อคนั้นทันทีและข้ามไปทำงานในบล็อคคำสั่ง Catch แทน ต่อไปเป็นรูปแบบการตรวจจับ Exception ในภาษา Visual Basic

Try
...
Catch ex As ExceptionType
...
End Try

จากรูปแบบการใช้งาน Exception ในบล็อคของคำสั่ง Try เป็นส่วนในการตรวจจับ Exception ที่อาจจะเกิดขึ้น ในบล็อคของคำสั่ง Catch เป็นการจัดการกับ Exception โดย ExceptionType เป็นประเภทของ Exception โดยบล็อคของคำสั่ง Catch สามารถมีได้หลายบล็อคถ้าหากมีมากกว่าหนึ่ง Exception ที่สามารถเกิดขึ้นได้

การตรวจจับและจัดการ Exception

ต่อไปมาดูตัวอย่างการตรวจจับ Exception ในภาษา Visual Basic เราจะให้ตัวอย่างสำหรับการหารตัวเลข Integer สองจำนวน และเราจะจัดการกับ Exception ที่อาจจะเกิดขึ้น

Module ExcepetionExample

Sub Main()

Dim a As Integer = 10
Dim b As Integer = 0

Try
Dim c As Integer = a \ b
Catch ex As DivideByZeroException
Console.WriteLine(ex.Message)
End Try

End Sub

End Module

ในตัวอย่างเป็นโปรแกรมในการหารตัวเลขสองตัว โดยในบล็อคของคำสั่ง Try นั้น Exception สามารถเกิดขึ้นได้ถ้าหาก ค่าของ b เป็น 0 เมื่อเรารันโปรแกรมนี้จะทำให้เกิด Exception ขึ้นโดย common language runtime (CLR) ดังนั้นเราจึงต้องตรวจจับ DivideByZeroExceptionException ซึ่งเป็นคลาสจากไลบรารี่ ในภาษา Visual Basic

Attempted to divide by zero.

นี่เป็นผลลัพธ์ของโปรแกรม คุณจะเห็นว่าโปรแกรมจะทำงานในบล็อคคำสั่ง Catch ที่เราได้แสดงข้อความเกี่ยวกับ Exception จาก Property ex.Message ถ้าคุณเปลี่ยนค่า b เป็นค่าอื่นที่ไม่ใช้ 0 Exception จะไม่เกิด

การจัดการกับหลาย Exception

ในการทำงานบางอย่างนั้นอาจจะสามารถเกิด Exception ได้หลายแบบในคำสั่งเดียวหรือหลายคำสั่ง ดังนั้นคุณสามารถตรวจจับหลาย Exception ได้โดยการเพิ่มบล็อคของคำสั่ง Catch เข้าไปสำหรับจัดการกับ Exception ได้เท่าที่ต้องการ

Module MultipleExcepetion

Sub Main()

Dim names = New String() {"C++", "C#", "Java", "Visual Basic"}
Dim index As Integer

Try
index = CType(Console.ReadLine(), Integer)
Console.WriteLine(names(index))
Catch ex As InvalidCastException
Console.WriteLine(ex.Message)
Catch ex As IndexOutOfRangeException
Console.WriteLine(ex.Message)
End Try

End Sub

End Module

ในตัวอย่างเป็นการตรวจจับหลาย Exception ในภาษา Visual Basic เราได้เขียนโปรแกรมสำหรับอ่านค่าในอาเรย์ โดยใส่ Index ของอาเรย์เข้ามา ในบล็อคของคำสั่ง Try มีสอง Exception ที่สามารถจะเกิดขึ้นได้สองแบบในโปรแกรมของเรา

index = CType(Console.ReadLine(), Integer)

เรารับค่าเป็น String ก่อนที่จะแปลงเป็นตัวเลขดังนั้นการแปลงอาจจะทำให้เกิด InvalidCastException Exception ขึ้นถ้า หากค่าที่ใส่มาไม่ถูกต้องในรูปแบบของตัวเลข

Console.WriteLine(names(index))

ในคำสั่งนี้เป็นการอ่านค่าอาเรย์จาก Index ที่ใส่เข้ามา ในกรณีที่ตัวเลขของ Index นั้นมีค่ามากกว่าขนาดของอาเรย์จะทำให้เกิด IndexOutOfRangeException Exception ขึ้น

ซึ่งในบล็อคของคำสั่ง Catch แต่ละบล็อคจะเป็นการจัดการกับ Exception แต่ละแบบที่เกิดขึ้น คุณสามารถดูรายละเอียดของ Exception ได้ในตัวแปรออบเจ็ค ex

จากตัวอย่างเดิม ต่อไปเราจะเปลี่ยนเป็นการตรวจจับ Exception แบบซ้อนกัน (nested)

Module NestedExcepetion

Sub Main()

Dim names = New String() {"C++", "C#", "Java", "Visual Basic"}
Dim index As Integer

Try
index = CType(Console.ReadLine(), Integer)
Try
Console.WriteLine(names(index))
Catch ex As IndexOutOfRangeException
Console.WriteLine(ex.Message)
End Try

Catch ex As InvalidCastException
Console.WriteLine(ex.Message)
End Try

End Sub

End Module

ในตัวอย่าง เราได้เปลี่ยนการตรวจจับ Exception เป็นแบบ nested ที่คุณสามารถทำได้เช่นเดียวกันกับคำสั่งเงื่อนไขและวนซ้ำ

a
Conversion from string "a" to type 'Integer' is not valid.

นี่เป็นผลลัพธ์ของโปรแกรมเมื่อเราใส่ค่า index ที่ไม่

ถ้าคุณสามารถตรวจจับ Exception ทั้งหมดที่จะเกิดขึ้นในภาษา Visual Basic ได้ด้วยคำสั่ง Catch ex As Exception เพราะว่า Exception ทั้งหมดนั้นสืบทอดมาจากคลาส Exception

User defined exception

User defined exception คือ Exception ที่คุณสามารถสร้างขึ้นมาจัดการกับ Exception ของคุณเองได้ การสร้าง Exception ต้องสืบทอดจากคลาส Exception เสมอ ต่อไปมาดูตัวอย่างสำหรับการสร้าง Exception แบบกำหนดเองในภาษา Visual Basic

Class NegativeNumberException
Inherits Exception

Public Sub New()
MyBase.New("Negative number exception occurred")
End Sub

End Class

ในตัวอย่างเราได้สร้าง NegativeNumberException Exception สำหรับข้อผิดพลาดถ้าหากตัวเลขนั้นเป็นจำนวนลบ ในคอนสตรัคเตอร์ของ Exception นี้เราได้เรียกใช้คอนสตรัคเตอร์ของ Base คลาสและกำหนดข้อความแจ้งเตือนให้กับ Exception นี้ผ่าน Base คลาส ตัวอย่างต่อไปเราจะใช้งาน Exception ที่เราสร้างขึ้น

การใช้คำสั่ง Throw

คำสั่ง Throw เป็นคำสั่งที่คุณสามารถสั่งให้เกิด Exception ขึ้นได้ ต่อไปเป็นการใช้คำสั่ง Throw สำหรับการทำให้เกิด Exception ขึ้นในทันที เราจะเขียนโปรแกรมหาค่า Factorial โดยให้ผู้ใช้กรอกค่าตัวเลขที่ต้องการเข้ามา

Class NegativeNumberException
Inherits Exception

Public Sub New()
MyBase.New("Negative number exception occurred")
End Sub

End Class

Module FacorialProgram

Function Factorial(ByVal n As Integer) As Integer
If n = 0 Or n = 1 Then
Return 1
Else
Return n * Factorial(n - 1)
End If
End Function

Sub Main()

Dim number As Integer

Console.WriteLine("Factorial program")
Console.Write("Enter a positive number: ")

Try
number = CType(Console.ReadLine(), Integer)
If number < 0 Then
Throw New NegativeNumberException()
End If

If number > 10 Then
Throw New OverflowException("Fatorial's result exceeds maximum value that integer type can handle")
End If

Console.WriteLine("{0}! = {1}", number, Factorial(number))

Catch ex As NegativeNumberException
Console.WriteLine(ex.Message)
Catch ex As OverflowException
Console.WriteLine(ex.Message)
End Try

End Sub

End Module

ในตัวอย่างเป็นโปรแกรมหาค่า Factorial โดยเราจะนำคลาส NegativeNumberException ที่เราได้สร้างไว้ก่อนหน้ามาใช้งาน และเราจะใช้คำสั่ง Throw สำหรับทำให้เกิด Exception ขึ้น ในการหาค่า Factorial นั้นจะมีเงื่อนไขบางอย่างที่เราต้องตรวจสอบ

If number < 0 Then
Throw New NegativeNumberException()
End If

ในคำสั่งนี้เราได้ตรวจสอบตัวแปร number ถ้าหากมันมีค่าน้อยกว่า 0 เพราะว่าการหาค่า Factorial สำหรับค่าลบนั้นไม่มี เราจึงทำให้เกิด NegativeNumberException Exception ขึ้น

If number > 10 Then
Throw New OverflowException("Factorial's result exceeds maximum value that integer type can handle")
End If

ในคำสั่งเราได้ตรวจสอบถ้าหากตัวเลขที่ต้องการหา Factorial นั้นใหญ่กว่า 10 ซึ่งประเภทข้อมูลแบบ Integer ที่เราได้กำหนดไว้ในฟังกชัน Factorial จะไม่สามารถร้องรับได้ โดยปกติโปรแกรมจะ Throw OverflowException อัตโนมัติถ้าหากมันเกิดขึ้น แต่ในตัวอย่างเราได้ใช้คำสั่ง Throw เพื่อทำให้เกิดขึ้นก่อนเพราะเราทราบล่วงหน้า และเปลี่ยนข้อความผิดพลาดเป็นที่เรากำหนดเอง

การใช้งานคำสั่ง Finally

คำสั่ง Finally จะทำงานเสมอไม่ว่าโปรแกรมจะงานในบล็อคของคำสั่ง Try หรือ Catch มันมักจะใช้กับการทำงานบางอย่างที่จำเป็นต้องทำเสมอไม่ว่าจะเกิด Exception ขึ้นหรือไม่ เช่น การเปิดปิดไฟล์ การอ่านค่าจาก Network Steam

Imports System.IO

Module FinallyStatement

Sub Main()

Dim path As String = "d:/MyFile.txt"

Dim sw As StreamWriter

Try
sw = File.AppendText(path)
Dim tw As TextWriter = CType(sw, TextWriter)
tw.WriteLine("Writing text to the file.")
tw.Close()
Catch ex As Exception
Console.WriteLine(ex.Message)
Finally
If sw IsNot Nothing Then
sw.Close()
End If
End Try

End Sub

End Module

นี่เป็นตัวอย่างของการทำงานกับไฟล์ เราได้ใช้คำสั่ง Finally สำหรับการปิดการทำงานของ File Stream หลังจากเราใช้คำสั่ง sw = File.AppendText(path) ในการเปิดไฟล์ มันจะต้องถูกปิดเสมอไม่ว่ามันจะเปิดสำเร็จหรือไม่ก็ตาม ดังนั้นการเขียนโปรแกรมเกี่ยวกับไฟล์หรือการ Stream คุณจะต้องปิดทุกครั้ง เพื่อให้โปรแกรมอื่นสามารถใช้ได้ต่อไป

ในบทนี้ คุณได้เรียนรู้เกี่ยวกับ Exception ในภาษา Visual Basic ซึ่งเป็นการจัดการข้อผิดพลาดที่จะเกิดขึ้นในโปรแกรม เพื่อทำให้โปรแกรมมีความปลอดภัยมากที่สุด


บทความเกี่ยวกับ Exception

Exception ในภาษา C#

ในบทนี้ คุณจะได้เรียนและทำความรู้จักกับ Exception ในภาษา C# รวมถึงการใช้งาน Exception จากไลบรารี่ที่ภาษา C# มีให้ และการจัดการและสร้าง Exception แบบกำหนดเอง Exc...

Exception ในภาษา Java

ในบทนี้ คุณจะได้เรียนรู้เกี่ยวกับ exception ในภาษา Java มันเป็นวิธีการจัดการข้อผิดพลาดที่เกิดขึ้นในขณะที่โปรแกรมทำงาน Exception คือการที่โปรแกรมพยายามจะทำงานบาง...

Exceptions ในภาษา C++

ในการเขียนโปรแกรม อาจจะมีบางครั้งที่โปรแกรมเกิดข้อผิดพลาดขึ้น ซึ่งข้อผิดพลาดนี้อาจจะเกิดจากการเขียนโปรแกรมหรืออาจจะเกิดจากสภาพแว้ดล้อมอย่างอื่น เมื่อเกิดข้อผิดพ...

Exceptions ในภาษา PHP

ในบทนี้ คุณจะได้เรียนรู้เกี่ยวกับ Exception ในภาษา PHP เพื่อจัดการกับข้อผิดพลาดที่เกิดขึ้นในขณะที่โปรแกรมกำลังทำงาน เพื่อให้โปรแกรมสามารถทำงานได้ต่อไป เราจะพูดถ...