การจัดการข้อผิดพลาดใน VB.Net (Try Catch)

⚡ สรุปอย่างชาญฉลาด

การจัดการข้อยกเว้นใน VB.Net ช่วยจัดการข้อผิดพลาดขณะรันไทม์ เช่น การหารด้วยศูนย์ โดยใช้คีย์เวิร์ด Try, Catch, Finally และ Throw เพื่อให้โปรแกรมสามารถตอบสนองต่อปัญหาได้อย่างราบรื่น แทนที่จะหยุดทำงานระหว่างการประมวลผล

  • 🔍 ยกเว้น: ปัญหาที่เกิดขึ้นระหว่างการประมวลผล เช่น การหารตัวเลขด้วยศูนย์
  • 🛡️ ลองจับดูสิ: ฟังก์ชัน `Try` จะห่อหุ้มโค้ดที่มีความเสี่ยง ส่วนฟังก์ชัน `Catch` จะจัดการกับข้อยกเว้นที่เกิดขึ้น
  • ✅ สุดท้าย: บล็อก Finally จะทำงานไม่ว่าจะมีข้อผิดพลาดเกิดขึ้นหรือไม่ก็ตาม
  • 🚦 โยน: คำสั่ง `throw` จะส่งคืนอ็อบเจ็กต์ข้อยกเว้นที่สืบทอดมาจากคลาส `System.Exception`
  • 🧩 ข้อยกเว้นที่กำหนดเอง: สืบทอดคลาส ApplicationException เพื่อกำหนดประเภทข้อยกเว้นของคุณเอง
  • 🤖 ความช่วยเหลือจาก AI: GitHub Copilot และ IntelliCode สร้างบล็อก Try Catch ขณะที่คุณพิมพ์

การจัดการข้อผิดพลาดใน VB.Net

ข้อยกเว้นใน VB.Net คืออะไร?

An ข้อยกเว้น ใน VB.Net กล่าวถึงปัญหาที่เกิดขึ้นระหว่างการทำงานของโปรแกรม ซึ่งเกิดจากสถานการณ์ที่ไม่คาดคิด ตัวอย่างที่ดีคือเมื่อคุณทำการหาร แล้วคุณหารด้วยศูนย์ (0) จะเกิดข้อยกเว้นขึ้น

การจัดการข้อยกเว้นใน VB.Net คืออะไร

โดยมีข้อยกเว้นใน VB.Netคุณสามารถโอนการควบคุมโปรแกรมจากส่วนหนึ่งไปยังอีกส่วนหนึ่งได้ ใน VB.Net ข้อยกเว้นจะถูกจัดการโดยใช้คีย์เวิร์ด 4 คำต่อไปนี้:

คำหลัก รายละเอียด
ดู การทำงานของบล็อก Try คือการระบุบล็อกโค้ดที่จะเปิดใช้งานข้อยกเว้นเฉพาะ ควรตามด้วย catch block(s)
จับ การตรวจจับข้อยกเว้นเสร็จสิ้นในบล็อกนี้ เป็นตัวจัดการข้อยกเว้นซึ่งมีการจัดการข้อยกเว้น
ในที่สุด ใช้บล็อกสุดท้ายเพื่อรันชุดคำสั่งไม่ว่าจะมีข้อยกเว้นเกิดขึ้นหรือไม่ก็ตาม
โยน มีข้อยกเว้นเกิดขึ้นหลังจากการเกิดปัญหา นี่คือผลงานของคีย์เวิร์ด Throw

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

ไวยากรณ์ของ Try Catch ใน VB.Net

คำสั่ง Try Catch ใน VB.Net ถูกกำหนดโดยใช้ไวยากรณ์ด้านล่าง:

Try
   [ try_Statement(s) ]
   [ Exit Try ]
[ Catch [ exception_name [ As type ] ] [ When expression ]
   [ catch_Statement(s) ]
   [ Exit Try ] ]
[ Catch ... ]
[ Finally
   [ finally_Statement(s) ] ]
End Try

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

ตัวอย่างการจัดการข้อยกเว้นใน VB.Net พร้อม Try Catch และสุดท้าย

ด้วยคำสั่ง Try/Catch คุณสามารถแยกโค้ดโปรแกรมปกติออกจากระบบการจัดการข้อผิดพลาดได้ เราจะสาธิตวิธีการจัดการข้อยกเว้นโดยใช้คีย์เวิร์ด Try, Catch และ Finally

ขั้นตอน 1) สร้างแอปพลิเคชันคอนโซลใหม่

ขั้นตอน 2) ใช้รหัสนี้:

Module Module1
    Sub divisionFunction(ByVal n1 As Integer, ByVal n2 As Integer)
        Dim answer As Integer
        Try
            answer = n1 \ n2
        Catch ex As DivideByZeroException
            Console.WriteLine("Exception: {0}", ex)
        Finally
            Console.WriteLine("Answer is: {0}", answer)
        End Try
    End Sub
    Sub Main()
        divisionFunction(4, 0)
        Console.ReadKey()
    End Sub

End Module

ขั้นตอน 3) คลิกปุ่ม Start จากแถบเครื่องมือเพื่อรันโค้ด คุณจะได้รับผลลัพธ์ดังต่อไปนี้:

เอาต์พุตคอนโซลของ VB.Net Try Catch Finally แสดงข้อผิดพลาด DivideByZeroException ที่ถูกดักจับได้

นี่คือภาพหน้าจอของรหัส:

ตัวอย่างโค้ด VB.Net Try Catch Finally แสดงใน Visual Studio

คำอธิบายของ Code:

  1. การสร้างโมดูลชื่อ Module1
  2. การสร้างขั้นตอนย่อยชื่อ departmentFunction โดยมีอาร์กิวเมนต์จำนวนเต็มสองตัว n1 และ n2 ByVal เป็นคีย์เวิร์ด VB.Net ที่ระบุว่าค่าของอาร์กิวเมนต์จะถูกส่งผ่านตามค่า
  3. การสร้างตัวแปรจำนวนเต็มชื่อคำตอบ
  4. จุดเริ่มต้นของบล็อก Try/Catch เราจำเป็นต้องล้อมรอบโค้ดที่เราสงสัยว่าอาจก่อให้เกิดข้อยกเว้นกับบล็อกนี้
  5. ดำเนินการหารระหว่างค่าของตัวแปร n1 และ n2 ผลลัพธ์ของการดำเนินการหารจะถูกกำหนดให้กับตัวแปรคำตอบ โค้ดนี้อาจสร้างข้อยกเว้นได้ เช่น เมื่อเราหารตัวเลขด้วยศูนย์ ดังนั้นเราจึงได้ล้อมตัวเลขนั้นด้วยบล็อค Try/Catch
  6. การตรวจจับข้อยกเว้นชื่อ DivideByZeroException และกำหนดข้อความข้อยกเว้นที่สร้างขึ้นให้กับอดีต
  7. การพิมพ์ข้อความบนคอนโซลเพื่อแจ้งให้ผู้ใช้ทราบถึงประเภท/ชื่อของข้อยกเว้นที่เกิดขึ้น
  8. บล็อกสุดท้าย สิ่งนี้จะดำเนินการไม่ว่าจะตรวจพบข้อยกเว้นหรือไม่ก็ตาม
  9. พิมพ์ข้อความบางส่วนบนคอนโซลเพื่อแสดงผลลัพธ์ของการดำเนินการหาร
  10. จุดสิ้นสุดของบล็อก Try นั่นคือจุดสิ้นสุดของรหัสการจัดการข้อผิดพลาด
  11. สิ้นสุดขั้นตอนย่อยของแผนกฟังก์ชัน
  12. จุดเริ่มต้นของขั้นตอนย่อยหลัก
  13. การเรียก/เรียกใช้กระบวนการย่อย divisionFunction ค่าของอาร์กิวเมนต์จำนวนเต็มสองตัวจะถูกส่งมาที่นี่ ค่าของ n1=4 และ n2=0 หมายความว่าการดำเนินการหารจะเท่ากับ 4\0 นั่นคือ n1\n2
  14. การหยุดหน้าต่างคอนโซลชั่วคราวเพื่อรอให้ผู้ใช้ดำเนินการเพื่อปิด
  15. สิ้นสุดขั้นตอนย่อยหลัก
  16. จุดสิ้นสุดของโมดูล

ข้อยกเว้นที่ผู้ใช้กำหนดใน VB.Net

VB.Net อนุญาตให้คุณกำหนดข้อยกเว้นของคุณเองได้ คุณสามารถรับคลาสข้อยกเว้นที่ผู้ใช้กำหนดเองได้จากคลาส ApplicationException เรามาสาธิตด้วยตัวอย่างกัน:

ตัวอย่างข้อยกเว้นที่ผู้ใช้กำหนดใน VB.Net

ต่อไปนี้เป็นตัวอย่างของข้อยกเว้นที่ผู้ใช้กำหนดเองใน VB.Net:

ขั้นตอน 1) สร้างแอปพลิเคชันคอนโซลใหม่

ขั้นตอน 2) ใช้รหัสต่อไปนี้:

Module Module1

    Public Class HeightIsZeroException : Inherits ApplicationException
        Public Sub New(ByVal text As String)
            MyBase.New(text)
        End Sub
    End Class
    Public Class Height
        Dim height As Integer = 0
        Sub showHeight()
            If (height = 0) Then
                Throw (New HeightIsZeroException("Zero Height found"))
            Else
                Console.WriteLine("Height is: {0}", height)
            End If
        End Sub
    End Class
    Sub Main()
        Dim hght As Height = New Height()
        Try
            hght.showHeight()
        Catch ex As HeightIsZeroException
            Console.WriteLine("HeightIsZeroException: {0}", ex.Message)
        End Try
        Console.ReadKey()
    End Sub

End Module

ขั้นตอน 3) คลิกปุ่ม Start จากแถบด้านบนเพื่อรันโค้ด คุณจะได้รับผลลัพธ์ดังต่อไปนี้:

ข้อความแสดงข้อผิดพลาด HeightIsZeroException ที่ผู้ใช้กำหนดเองใน VB.Net ปรากฏบนคอนโซล

นี่คือภาพหน้าจอของรหัส:

ตัวอย่างโค้ดการสร้างคลาสข้อยกเว้นที่ผู้ใช้กำหนดเองใน VB.Net โดยใช้ Visual Studio

คำอธิบายของ Code:

  1. การสร้างโมดูลชื่อ Module1
  2. การสร้างคลาสข้อยกเว้นชื่อ HeightIsZeroException คลาสสืบทอดคลาส ApplicationException ทั้งหมด
  3. การสร้างขั้นตอนย่อยชื่อใหม่ จะใช้เวลาหนึ่งอาร์กิวเมนต์สตริงชื่อข้อความ
  4. การเรียกตัวสร้างคลาสฐานและส่งผ่านไปยังอาร์กิวเมนต์ข้างต้น
  5. สิ้นสุดขั้นตอนย่อยใหม่
  6. จุดสิ้นสุดของคลาส HeightIsZeroException
  7. การสร้างคลาสชื่อ Height ตัวแก้ไขการเข้าถึงสาธารณะคือ สาธารณะ ซึ่งหมายความว่าจะสามารถเข้าถึงได้โดยสาธารณะ
  8. การสร้างตัวแปรจำนวนเต็มชื่อ Height และกำหนดค่าเริ่มต้นเป็น 0
  9. การสร้างขั้นตอนย่อยชื่อ showHeight()
  10. ตรวจสอบว่าค่าของตัวแปร Height เป็น 0 เมื่อใด เราได้ใช้เงื่อนไข If…Then
  11. เมื่อต้องการโยน HeightIsZeroException หากเงื่อนไขข้างต้นเป็นจริง ข้อความ Zero Height Found จะแสดงขึ้นเมื่อมีการส่งข้อยกเว้นนี้
  12. ส่วน Else จะถูกดำเนินการเมื่อเงื่อนไข If ไม่เป็นความจริง
  13. ข้อความที่จะพิมพ์บนคอนโซลแสดงความสูงเมื่อไม่ใช่ 0
  14. สิ้นสุดเงื่อนไข If
  15. สิ้นสุดขั้นตอนย่อย showHeight()
  16. จบชั้นเรียนความสูง
  17. จุดเริ่มต้นของขั้นตอนย่อยหลัก
  18. การสร้างวัตถุชื่อ Height เป็นตัวอย่างของคลาส Height
  19. จุดเริ่มต้นของบล็อกการจัดการข้อยกเว้น
  20. เรียกใช้ซับโปรซีเดอร์ showHeight() ที่กำหนดไว้ในคลาส Height เราใช้อ็อบเจ็กต์ของคลาสนี้ในการเข้าถึงเมธอดนี้ บรรทัดนี้อาจทำให้เกิดข้อยกเว้น ดังนั้นเราจึงได้ใส่โค้ดจัดการข้อยกเว้นไว้รอบๆ บรรทัดนี้
  21. การจับ HeightIsZeroException Exception เป็นวัตถุ ex ในกรณีที่เกิดขึ้น
  22. ข้อความที่จะพิมพ์บนคอนโซลเมื่อตรวจพบ HeightIsZeroException
  23. จุดสิ้นสุดของบล็อกการจัดการข้อยกเว้น
  24. หยุดหน้าต่างคอนโซลชั่วคราวเพื่อรอให้ผู้ใช้ดำเนินการเพื่อปิด
  25. สิ้นสุดขั้นตอนย่อยหลัก
  26. จุดสิ้นสุดของโมดูล

โยนข้อยกเว้นใน VB.Net

ในการจัดการข้อยกเว้น คุณสามารถเลือกที่จะโยนอ็อบเจ็กต์ได้ อย่างไรก็ตาม อ็อบเจ็กต์นั้นจะต้องสืบทอดมาจากคลาส System.Exception โดยตรงหรือโดยอ้อม ตัวอย่างเช่น:

ตัวอย่าง Throw Exception ใน VB.Net

ด้านล่างนี้คือตัวอย่างของการโยนข้อยกเว้น (throw exception) ใน VB.Net:

ขั้นตอน 1) สร้างแอปพลิเคชันคอนโซลใหม่

ขั้นตอน 2) ใช้รหัสต่อไปนี้:

Module Module1

    Sub Main()
        Try
            Throw New ApplicationException("Throwing a custom exception")
        Catch ex As Exception
            Console.WriteLine(ex.Message)
        Finally
            Console.WriteLine("The Finally Block")
        End Try
        Console.ReadKey()
    End Sub


End Module

ขั้นตอน 3) คลิกปุ่มเริ่มจากแถบด้านบนเพื่อรันโค้ด คุณควรได้รับสิ่งต่อไปนี้:

เอาต์พุตคอนโซลของคำสั่ง throw ใน VB.Net ที่แสดงข้อความข้อยกเว้นที่กำหนดเอง

นี่คือภาพหน้าจอของรหัส:

ตัวอย่างโค้ดการโยนข้อยกเว้นใน VB.Net โดยใช้ Try Catch Finally

คำอธิบายของ Code:

  1. การสร้างโมดูลชื่อ Module1
  2. จุดเริ่มต้นของขั้นตอนย่อยหลัก
  3. จุดเริ่มต้นของรหัสการจัดการข้อผิดพลาด
  4. กำลังสร้างวัตถุข้อยกเว้น โค้ดนี้อาจสร้างข้อยกเว้น ดังนั้นเราจึงล้อมรอบวัตถุด้วยบล็อก Try/Catch
  5. การจับข้อยกเว้นเป็นวัตถุเช่นถ้าบรรทัดส่งข้อยกเว้น
  6. การพิมพ์ข้อความข้อยกเว้นบนคอนโซลในกรณีที่เกิดขึ้น
  7. บล็อกสุดท้ายที่จะรันไม่ว่าจะตรวจพบข้อยกเว้นหรือไม่ก็ตาม
  8. ข้อความที่จะพิมพ์บนคอนโซลเมื่อมีการดำเนินการบล็อกสุดท้าย
  9. จุดสิ้นสุดของรหัสการจัดการข้อยกเว้น
  10. หยุดคอนโซลชั่วคราวสักครู่เพื่อรอให้ผู้ใช้ดำเนินการเพื่อปิด
  11. สิ้นสุดขั้นตอนย่อยหลัก
  12. จุดสิ้นสุดของโมดูล

คำถามที่พบบ่อย

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

ใช่แล้ว ให้เขียนบล็อก Catch หลายๆ บล็อกเพื่อจัดการกับข้อยกเว้นประเภทต่างๆ เรียงลำดับจากเฉพาะเจาะจงที่สุดไปจนถึงเฉพาะเจาะจงน้อยที่สุด เพราะ VB.Net จะตรวจสอบตามลำดับและใช้บล็อกที่ตรงกันอันแรก

โดยส่วนใหญ่แล้ว ฟังก์ชัน `Finally` จะทำงานไม่ว่าจะมีข้อยกเว้นเกิดขึ้นหรือไม่ และแม้กระทั่งหลังจากคำสั่ง `Return` ฟังก์ชันนี้จะถูกข้ามไปก็ต่อเมื่อพบคำสั่ง `End` หรือเกิด StackOverflowException เท่านั้น

คำสั่ง `throw` จะยกข้อยกเว้นปัจจุบันขึ้นมาอีกครั้งและคงสแต็กเดิมไว้ trace. การโยน ex จะรีเซ็ตสแต็ก tracแสดงข้อผิดพลาดในบรรทัดปัจจุบัน โดยซ่อนตำแหน่งที่เกิดข้อผิดพลาดที่แท้จริง ควรใช้คำสั่ง Throw แบบธรรมดาจะดีกว่า

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

ข้อยกเว้นที่พบบ่อย ได้แก่ DivideByZeroException, NullReferenceException, IndexOutOfRangeException, FormatException และ OverflowException ข้อยกเว้นเหล่านี้ล้วนสืบทอดมาจาก System.Exception และสามารถดักจับได้ทีละรายการ

ใช่. นักบิน GitHub แปลงข้อความแสดงความคิดเห็นภาษาอังกฤษธรรมดาให้เป็นบล็อก Try Catch Finally ที่สมบูรณ์ และแนะนำประเภทข้อยกเว้นที่เหมาะสม ตรวจสอบตัวจัดการที่สร้างขึ้นทุกครั้ง

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

สรุปโพสต์นี้ด้วย: