ปรับปรุง:
ในฐานะของ PHP 7.1 นี้สามารถใช้ได้
ไวยากรณ์คือ:
try
{
// Some code...
}
catch(AError | BError $e)
{
// Handle exceptions
}
catch(Exception $e)
{
// Handle the general case
}
เอกสาร: https://www.php.net/manual/th/language.exceptions.php#example-287
RFC: https://wiki.php.net/rfc/multiple-catch
กระทำ: https://github.com/php/php-src/commit/0aed2cc2a440e7be17552cc669d71fdd24d1204a
สำหรับ PHP ก่อน 7.1:
แม้ว่าคำตอบอื่น ๆ เหล่านี้จะพูดคุณสามารถจับAError
และBError
อยู่ในบล็อกเดียวกัน (มันค่อนข้างง่ายกว่าถ้าคุณเป็นคนที่กำหนดข้อยกเว้น) แม้จะมีข้อยกเว้นที่คุณต้องการ "ล้มเหลว" คุณควรจะสามารถกำหนดลำดับชั้นเพื่อให้ตรงกับความต้องการของคุณ
abstract class MyExceptions extends Exception {}
abstract class LetterError extends MyExceptions {}
class AError extends LetterError {}
class BError extends LetterError {}
แล้ว:
catch(LetterError $e){
//voodoo
}
อย่างที่คุณเห็นที่นี่และที่นี่แม้แต่SPL
ข้อยกเว้นเริ่มต้นก็มีลำดับชั้นที่คุณสามารถใช้ประโยชน์ได้ นอกจากนี้ตามที่ระบุไว้ในคู่มือ PHP :
เมื่อมีข้อผิดพลาดถูกโยนรหัสต่อไปนี้คำสั่งจะไม่ถูกดำเนินการและPHP จะพยายามค้นหา catch catch ที่ตรงกันแรก
ซึ่งหมายความว่าคุณสามารถมี
class CError extends LetterError {}
ซึ่งคุณต้องจัดการแตกต่างกว่าAError
หรือBError
ดังนั้นคำสั่ง catch ของคุณจะเป็นดังนี้:
catch(CError $e){
//voodoo
}
catch(LetterError $e){
//voodoo
}
หากคุณมีกรณีที่มีข้อยกเว้นยี่สิบข้อขึ้นไปที่อยู่ภายใต้ซูเปอร์คลาสเดียวกันอย่างถูกกฎหมายและคุณจำเป็นต้องจัดการห้าข้อ (หรือกลุ่มใด ๆ ที่มีขนาดใหญ่) ในทางเดียวและที่เหลือคุณสามารถทำได้
interface Group1 {}
class AError extends LetterError implements Group1 {}
class BError extends LetterError implements Group1 {}
แล้ว:
catch (Group1 $e) {}
การใช้ OOP เมื่อกล่าวถึงข้อยกเว้นมีประสิทธิภาพมาก ใช้สิ่งที่ชอบget_class
หรือinstanceof
แฮ็กและควรหลีกเลี่ยงถ้าเป็นไปได้
โซลูชันอื่นที่ฉันต้องการเพิ่มคือการวางฟังก์ชันการจัดการข้อยกเว้นในวิธีการของตนเอง
คุณสามารถมี
function handleExceptionMethod1(Exception $e)
{
//voodoo
}
function handleExceptionMethod2(Exception $e)
{
//voodoo
}
สมมติว่ามีอย่างวิธีที่คุณสามารถควบคุมชั้นวรรณะยกเว้นหรืออินเตอร์เฟซ (และมีเกือบตลอดเวลาไม่มีจะเป็นวิธีการ) คุณสามารถทำต่อไปนี้:
try
{
stuff()
}
catch(ExceptionA $e)
{
$this->handleExceptionMethod1($e);
}
catch(ExceptionB $e)
{
$this->handleExceptionMethod1($e);
}
catch(ExceptionC $e)
{
$this->handleExceptionMethod1($e);
}
catch(Exception $e)
{
$this->handleExceptionMethod2($e);
}
ด้วยวิธีนี้คุณยังคงมีรหัสตำแหน่งเดียวที่คุณต้องแก้ไขหากกลไกการจัดการข้อยกเว้นของคุณจำเป็นต้องเปลี่ยนและคุณกำลังทำงานภายในโครงสร้างทั่วไปของ OOP