হালনাগাদ:
পিএইচপি 7.1 হিসাবে, এটি উপলব্ধ।
বাক্য গঠনটি হ'ল:
try
{
// Some code...
}
catch(AError | BError $e)
{
// Handle exceptions
}
catch(Exception $e)
{
// Handle the general case
}
দস্তাবেজ: https://www.php.net/manual/en/language.exception.php#example-287
আরএফসি: https://wiki.php.net/rfc/m Multiple- catch
প্রতিশ্রুতিবদ্ধ: https://github.com/php/php-src/commit/0aed2cc2a440e7be17552cc669d71fdd24d1204a
পিএইচপি 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
ডিফল্ট ব্যতিক্রমগুলিরও একটি স্তরক্রম রয়েছে যা আপনি উত্সাহ অর্জন করতে পারেন। অতিরিক্ত হিসাবে, পিএইচপি ম্যানুয়াল অনুসারে :
যখন কোনও ব্যতিক্রম ছুঁড়ে ফেলা হয়, তখন বিবৃতি অনুসরণকারী কোডটি কার্যকর করা হবে না এবং পিএইচপি প্রথম ম্যাচিং ক্যাচ ব্লকটি সন্ধান করার চেষ্টা করবে।
এর অর্থ আপনারও থাকতে পারে
class CError extends LetterError {}
যা আপনাকে AError
বা অন্যের চেয়ে আলাদাভাবে পরিচালনা করতে হবে BError
, সুতরাং আপনার ক্যাচ স্টেটমেন্টটি দেখতে এইরকম হবে:
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);
}
এইভাবে, আপনার ব্যতিক্রম হ্যান্ডলিং পদ্ধতিটি পরিবর্তন করতে হবে এবং আপনি ওওপির সাধারণ কনস্ট্রাক্টের মধ্যে কাজ করছেন, তবে আপনার এখনও একটিমাত্র একক কোড অবস্থান রয়েছে you