ข้อยกเว้นที่กำหนดเองของ C ++

Khx Ykwen Thi Kahnd Xeng Khxng C



ข้อยกเว้นใน C ++ เป็นแนวคิดหลัก มีข้อยกเว้นเกิดขึ้นในเวลาดำเนินการเมื่อโปรแกรมพบความไม่สอดคล้องกันของรันไทม์หรือสถานการณ์ที่ผิดปกติ ในภาษา C++ คำว่า 'throw', 'try' และ 'catch' ใช้เพื่อจัดการหรือตรวจจับข้อยกเว้น คำสั่ง 'throw' ใช้เพื่อสร้างข้อยกเว้น คำว่า 'ลอง' ทำหน้าที่ในการส่งข้อยกเว้น และคำหลัก 'catch' หมายถึงการจัดการข้อยกเว้นที่พัฒนาด้วยคำ 'โยน' และถูกส่งโดยส่วน 'ลอง' เรามาเจาะลึกตัวอย่างบางส่วนเพื่อแสดงข้อยกเว้นในภาษา C++

ตัวอย่างที่ 1: โปรแกรมสร้างคลาสข้อยกเว้นแบบกำหนดเองใน C ++

ตัวอย่างง่ายๆ นี้ถูกนำมาใช้เพื่อสาธิตการจัดการและการตรวจจับข้อยกเว้นแบบกำหนดเองใน C ++

#รวม
#รวม <ข้อยกเว้น>
โดยใช้ เนมสเปซ มาตรฐาน ;

ระดับ DemoException : : สาธารณะ ข้อยกเว้น
{
เสมือน ค่าคงที่ ถ่าน * อะไร ( ) ค่าคงที่ โยน ( )
{
กลับ 'ตรวจพบข้อยกเว้นแบบกำหนดเอง' ;
}
} ;
ภายใน หลัก ( )
{
DemoException dEx ;
พยายาม
{
โยน เดกซ์ ;
}
จับ ( ข้อยกเว้น & ยกเว้น )
{
ศาล << ยกเว้น. อะไร ( ) << สิ้นสุด ;
}
กลับ 0 ;
}

เรากำหนดไฟล์ส่วนหัวในโค้ดซึ่งรวมถึง 'iostream' และ 'ข้อยกเว้น' “iostream” ถูกเรียกโดยเฉพาะสำหรับสตรีมอินพุตและเอาต์พุต ในขณะที่ไลบรารี “ข้อยกเว้น” ถูกเรียกออกมาเพื่อจัดการกับข้อยกเว้น หลังจากนี้ เราสร้างคลาส 'DemoException' ที่ได้มาจากคลาส 'ข้อยกเว้น' ของ C++ ที่นี่ เราตั้งค่าฟังก์ชัน what() เสมือนที่ใช้ในการจัดเตรียม const char* ซึ่งแสดงผลลัพธ์ของข้อความแสดงข้อผิดพลาดที่เชื่อมโยงกับข้อยกเว้น







จากนั้นเราเรียกใช้ฟังก์ชัน main() โดยที่เราสร้างวัตถุ 'dEx' ของคลาส 'DemoException' หลังจากนั้น เรามีคำจำกัดความของบล็อก 'ลอง' ซึ่งจะส่งข้อยกเว้นหากพบ ที่นี่เราโยนวัตถุ 'dEx'



ต่อไป เราตั้งค่าบล็อก 'catch' เพื่อตรวจจับข้อยกเว้นและจัดการมัน เราส่งผ่านการอ้างอิงของข้อยกเว้นคลาสเป็นพารามิเตอร์เพื่อจับข้อยกเว้นที่ได้รับมาจากคลาสนั้น ภายในบล็อก 'catch' เราเรียกใช้ฟังก์ชัน what() บน 'ยกเว้น' เพื่อรับข้อความแสดงข้อยกเว้นบนคอนโซล



หลังจากรันโปรแกรมที่กำหนด ข้อความข้อยกเว้นแบบกำหนดเองจะถูกตรวจจับและส่งไปที่คอนโซล:





ตัวอย่างที่ 2: โปรแกรมสร้างข้อยกเว้นแบบกำหนดเองโดยใช้สองคลาส

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



#รวม
โดยใช้ เนมสเปซ มาตรฐาน ;

ระดับ การประเมินผล1 { } ;
ระดับ การประเมินผล2 { } ;

ภายใน หลัก ( ) {
พยายาม {
โยน การประเมินผล1 ( ) ;
}
จับ ( การประเมินผล1จ ) {
ศาล << 'ตรวจพบข้อยกเว้นการประเมิน 1!' << สิ้นสุด ;
}
พยายาม {
โยน การประเมินผล2 ( ) ;
}
จับ ( การประเมินผล2 จ ) {
ศาล << 'จับข้อยกเว้นการประเมิน 2!' << สิ้นสุด ;
}

กลับ 0 ;
}

ในโค้ดที่กำหนด เรามีคำจำกัดความของสองคลาสคือ 'Evalued1' และ 'Evalued2' ซึ่งตอนนี้ว่างเปล่า หลังจากนั้นเราจะดำเนินการฟังก์ชัน main() ของโปรแกรม ที่นี่ เราตั้งค่าบล็อก try{} โดยที่คีย์เวิร์ด “throw” ถูกใช้เพื่อส่งอินสแตนซ์ของคลาส “Evalued1()” นี่แสดงว่าข้อยกเว้น “Evalued1” ถูกส่งออกไปหากมีข้อยกเว้นใดๆ เกิดขึ้นในโปรแกรมภายในบล็อก “try” นี้ หลังจากนั้น เรามีบล็อก catch{} ซึ่งตรวจพบข้อยกเว้นและแสดงข้อความของข้อยกเว้น

ในทำนองเดียวกัน เรามีคำจำกัดความของบล็อก try{} อื่นสำหรับคลาส 'Evalued2' ภายในบล็อก try{} เราจะโยนอินสแตนซ์ของคลาส 'Evalued2' สิ่งนี้จะทำให้เกิดข้อยกเว้นของ 'การประเมิน 2' หากมีข้อผิดพลาดเกิดขึ้นที่นี่ จากนั้น เราจะเรียกบล็อก catch{} เพื่อแสดงข้อความแสดงข้อยกเว้นโดยใช้คำสั่ง 'cout' หากพบข้อยกเว้นภายในบล็อกนี้

ข้อยกเว้นสองประการของบล็อก 'try-catch' ที่แตกต่างกันจะถูกส่งไปในคอนโซลซึ่งได้รับการจัดการโดยคลาสที่แตกต่างกันสองคลาส

ตัวอย่างที่ 3: โปรแกรมสร้างข้อยกเว้นแบบกำหนดเองด้วย Constructor

โปรแกรมใช้ตัวสร้างเพื่อจัดการข้อยกเว้น แม้ว่าเราจะไม่สามารถรับค่าจาก Constructor ได้ แต่เราสามารถทำได้โดยใช้บล็อก 'try-catch'

#รวม
โดยใช้ เนมสเปซ มาตรฐาน ;

ระดับ ทดสอบ {
ภายใน วาล ;

สาธารณะ : :
ทดสอบ ( ภายใน n )
{
พยายาม {
ถ้า ( n == 0 )
วาล = n ;
แสดง ( ) ;
}

จับ ( ค่าคงที่ ถ่าน * ประสบการณ์ ) {
ศาล << “พบข้อยกเว้น \n ' ;
ศาล << ประสบการณ์ << สิ้นสุด ;
}

}

เป็นโมฆะ แสดง ( )
{
ศาล << 'มูลค่า = ' << วาล << สิ้นสุด ;
}
} ;

ภายใน หลัก ( )
{

ทดสอบ ( 0 ) ;
ศาล << “สร้างตัวอย่างอีกครั้ง \n ' ;
ทดสอบ ( 1 ) ;
}

ในโค้ดที่กำหนด เราสร้างคลาส 'Test' โดยที่ตัวแปรถูกประกาศเป็น 'val' ของประเภทจำนวนเต็ม จากนั้น เรามีคำจำกัดความของฟังก์ชันคอนสตรัคเตอร์ “Test()” ซึ่งถูกส่งผ่านด้วยตัวแปร “n” จากนั้นเราตั้งค่าบล็อก 'try-catch' ภายในฟังก์ชันคอนสตรัคเตอร์ 'Test()' try block ถูกเรียกด้วยคำสั่ง if() หากค่าของ 'n' เท่ากับศูนย์ บล็อก 'catch' จะตรวจจับข้อยกเว้น และข้อความข้อยกเว้นจะถูกส่งไปที่พรอมต์ ค่าของ 'n' จะถูกเก็บไว้ในตัวแปร 'val' ขณะที่เรากำหนดค่าเริ่มต้น

หลังจากนั้นเราเรียกใช้ฟังก์ชัน display() เพื่อแสดงค่าที่เก็บไว้ในตัวแปร “val” ต่อไป เรามีคำจำกัดความของบล็อก 'catch' ซึ่งจะมีการจัดการข้อยกเว้นที่เกิดจากบล็อก 'ลอง' ในที่สุดเราก็เรียกใช้ฟังก์ชัน main() ภายในนั้นเราเรียกว่า Constructor “Test()” ตัวสร้างจะถูกทริกเกอร์เมื่อมีการสร้างอ็อบเจ็กต์ของคลาส “Test()” และระบุด้วยค่า “0” ซึ่งข้อยกเว้นจะถูกส่งออกไป

หลังจากนั้น เราเรียกคลาส “Test()” อีกครั้งเพื่อสร้างอินสแตนซ์ที่ถูกส่งผ่านด้วยค่า 1 ในที่นี้ Constructor จะไม่ส่งข้อยกเว้นใดๆ เนื่องจากค่าไม่เท่ากับ 0 ฟังก์ชัน display() จะ ดำเนินการและพิมพ์ค่าของ “val”

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

ตัวอย่างที่ 4: โปรแกรมสร้างข้อยกเว้นแบบกำหนดเองที่ผู้ใช้กำหนด

โปรแกรมที่นี่จะจัดการและตรวจจับข้อยกเว้นที่กำหนดโดยผู้ใช้เมื่อถูกถามในพรอมต์

#รวม
#รวม <ข้อยกเว้น>
โดยใช้ เนมสเปซ มาตรฐาน ;
ระดับ มายเดโม่ : : สาธารณะ ข้อยกเว้น {
สาธารณะ : :
ค่าคงที่ ถ่าน * อะไร ( ) ค่าคงที่ โยน ( )
{
กลับ “ข้อยกเว้น! พยายามหารด้วยศูนย์.! \n ' ;
}
} ;
ภายใน หลัก ( )
{
พยายาม
{
ภายใน n1, n2 ;
ศาล << 'ป้อนจำนวนเต็มสองตัว: \n ' ;
การกิน >> n1 >> n2 ;
ถ้า ( n2 == 0 )
{
มายเดโม่ n3 ;
โยน n3 ;
}
อื่น
{
ศาล << 'n1/n2 = ' << n1 / n2 << สิ้นสุด ;
}
}
จับ ( ข้อยกเว้น & เช่น )
{
ศาล << เช่น อะไร ( ) ;
}
}

ในโค้ดที่กำหนด ก่อนอื่นเราจะกำหนดคลาส 'MyDemo()' ซึ่งเป็นคลาสที่ขึ้นต่อกันของข้อยกเว้น หลังจากนั้น เราตั้งค่าสาธารณะว่าฟังก์ชัน what() ด้วยคีย์เวิร์ด 'เสมือน' ฟังก์ชัน what() ถูกเรียกออกมาเพื่อรับสาเหตุของข้อยกเว้นในโปรแกรม เมื่อฟังก์ชัน Throw() ส่งข้อยกเว้น จากนั้น เรามีฟังก์ชัน main() ที่กำหนดบล็อก try-catch{} เพื่อตรวจจับและจัดการข้อยกเว้น ภายในบล็อก try{} เราประกาศตัวแปรสองตัวคือ “n1” และ “n2” ซึ่งค่าที่ได้มาจากผู้ใช้โดยใช้คำสั่ง “cin” เมื่อได้รับค่าเทียบกับตัวแปร “n1” และ “n2” แต่ละตัว เงื่อนไข “if” จะตรวจสอบว่าตัวแปร “n2” เท่ากับ 0 หรือไม่ หากเป็นเช่นนั้น จะมีข้อยกเว้นเกิดขึ้นหรือส่งคืนผลลัพธ์การหาร สุดท้ายนี้ เรามีบล็อก catch{} ซึ่งใช้การอ้างอิงของคลาส 'ข้อยกเว้น' เป็นพารามิเตอร์ที่สืบทอดมาจากคลาสนั้น

ผลลัพธ์จะแสดงเมื่อไม่ตรงตามเงื่อนไขและโปรแกรมถูกดำเนินการโดยไม่มีข้อยกเว้น:

นอกจากนี้เรายังกำหนดค่าของ '0' ให้กับตัวแปร 'n2' เพื่อแสดงวิธีการส่งและตรวจจับข้อยกเว้นในโปรแกรม

บทสรุป

โดยสรุป เราได้แสดงให้เห็นแนวคิดที่สำคัญของ C++ ซึ่งเป็นข้อยกเว้น ข้อยกเว้นขัดขวางการดำเนินการปกติของโปรแกรม สำหรับสิ่งนี้ เราใช้คีย์เวิร์ด 'throw', 'try' และ 'catch' เพื่อจัดการกับข้อยกเว้นที่เกิดขึ้นในโปรแกรม เราใช้คำหลักเหล่านี้ในตัวอย่างก่อนหน้านี้เพื่อจัดการกับข้อยกเว้นที่แตกต่างออกไป