পিএইচপি টাইপ ইঙ্গিত করার জন্য আমি কীভাবে "ধরা পড়ার মতো মারাত্মক ত্রুটি" ধরতে পারি?


96

আমি আমার ক্লাসের কোনওটিতে পিএইচপি 5 এর টাইপ ইঙ্গিতটি প্রয়োগ করার চেষ্টা করছি,

class ClassA {
    public function method_a (ClassB $b)
    {}
}

class ClassB {}
class ClassWrong{}

সঠিক ব্যবহার:

$a = new ClassA;
$a->method_a(new ClassB);

উত্পাদন ত্রুটি:

$a = new ClassA;
$a->method_a(new ClassWrong);

ধরা পড়ার জন্য মারাত্মক ত্রুটি: আর্গুমেন্ট 1 ক্লাসএ পাস করেছে :: পদ্ধতি_এ () অবশ্যই ClassB এর একটি উদাহরণ হতে হবে, ClassWrong এর উদাহরণ দেওয়া আছে ...

সেই ত্রুটিটি ধরা কি সম্ভব (যেহেতু এটি "ক্যাচব্যাবল" বলে)? এবং যদি হ্যাঁ, কিভাবে?


4
ভবিষ্যতের রেফারেন্সের জন্য: ইঞ্জিনে ব্যতিক্রম (পিএইচপি 7 এর জন্য) - পিএইচপি 7 দিয়ে শুরু করা মারাত্মক ত্রুটিগুলি ধরা সম্ভব। এটি এখানে আলোচিত "ক্যাচবাল মারাত্মক ত্রুটি" ( E_RECOVERABLE_ERROR) এর জন্য যেমন এইগুলি পিএইচপি 7 দিয়ে শুরু করা হয়েছে ..
হ্যাক্রে

উত্তর:


114

আপডেট: পিএইচপি in-এ এটি আর ক্যাচিংয়ে মারাত্মক ত্রুটি নয় Instead পরিবর্তে একটি "ব্যতিক্রম" নিক্ষেপ করা হবে। একটি "ব্যতিক্রম" (ভীতিপূর্ণ উদ্ধৃতিগুলিতে) যা ব্যতিক্রম থেকে প্রাপ্ত নয় তবে ত্রুটি ; এটি এখনও একটি নিক্ষেপযোগ্য এবং সাধারণ চেষ্টা-ধরার ব্লক দিয়ে পরিচালনা করা যেতে পারে। দেখতে https://wiki.php.net/rfc/throwable-interface

যেমন

<?php
class ClassA {
  public function method_a (ClassB $b) { echo 'method_a: ', get_class($b), PHP_EOL; }
}
class ClassWrong{}
class ClassB{}
class ClassC extends ClassB {}


foreach( array('ClassA', 'ClassWrong', 'ClassB', 'ClassC') as $cn ) {
    try{
      $a = new ClassA;
      $a->method_a(new $cn);
    }
    catch(Error $err) {
      echo "catched: ", $err->getMessage(), PHP_EOL;
    }
}
echo 'done.';

প্রিন্ট

catched: Argument 1 passed to ClassA::method_a() must be an instance of ClassB, instance of ClassA given, called in [...]
catched: Argument 1 passed to ClassA::method_a() must be an instance of ClassB, instance of ClassWrong given, called in [...]
method_a: ClassB
method_a: ClassC
done.

প্রাক-পিএইচপি 7 সংস্করণের পুরানো উত্তর:
http://docs.php.net/errorfunc.constants বলেছেন:

E_RECOVERABLE_ERROR (পূর্ণসংখ্যা) ধরা
পড়ার মতো মারাত্মক ত্রুটি। এটি ইঙ্গিত দেয় যে সম্ভবত একটি বিপজ্জনক ত্রুটি ঘটেছে, তবে ইঞ্জিনটি অস্থির অবস্থায় ছাড়েনি। যদি ত্রুটিটি কোনও ব্যবহারকারীর সংজ্ঞায়িত হ্যান্ডেল দ্বারা ধরা না থাকে (দেখুন set_error_handler () দেখুন ), অ্যাপ্লিকেশনটি E_ERROR হিসাবে বাতিল হয়ে যায়।

আরও দেখুন: http://derickrethans.nl/erecoverableerror.html

যেমন

function myErrorHandler($errno, $errstr, $errfile, $errline) {
  if ( E_RECOVERABLE_ERROR===$errno ) {
    echo "'catched' catchable fatal error\n";
    return true;
  }
  return false;
}
set_error_handler('myErrorHandler');

class ClassA {
  public function method_a (ClassB $b) {}
}

class ClassWrong{}

$a = new ClassA;
$a->method_a(new ClassWrong);
echo 'done.';

প্রিন্ট

'catched' catchable fatal error
done.

সম্পাদনা করুন: তবে আপনি এটিকে ব্যতিক্রম করতে "চেষ্টা" করতে পারেন যা আপনি চেষ্টা-ধরা ব্লক দিয়ে পরিচালনা করতে পারেন

function myErrorHandler($errno, $errstr, $errfile, $errline) {
  if ( E_RECOVERABLE_ERROR===$errno ) {
    echo "'catched' catchable fatal error\n";
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
    // return true;
  }
  return false;
}
set_error_handler('myErrorHandler');

class ClassA {
  public function method_a (ClassB $b) {}
}

class ClassWrong{}

try{
  $a = new ClassA;
  $a->method_a(new ClassWrong);
}
catch(Exception $ex) {
  echo "catched\n";
}
echo 'done.';

দেখুন: http://docs.php.net/ErrorException


4
অবশ্যই এটি খুব মারাত্মক ত্রুটির মতো আচরণ করে, আপনি যখন নিজের সার্ভার লগগুলিতে সন্ধান করেন এটি ছাড়া আপনি এটি পাবেন না। ধন্যবাদ পিএইচপি: /
জন হান্ট

4
সুতরাং অন্য কথায় আপনি ক্যাচবাল ত্রুটি ধরতে পারবেন না। অপূর্ব!
পল ডি 'আউস্ট

@ পল আপনাকে এই সিদ্ধান্তে নিয়ে আসে কি?
ভোলকারক

4
ওহ, আমি কেবল বুঝিয়েছি এটি প্রচলিত অর্থে ধরাছোঁয়া ছিল না (চেষ্টা / ধরার ব্লক ব্যবহার করে)। আমি সেদিন পিএইচপি সম্পর্কে কেবল বিরক্ত বোধ করছিলাম, সুতরাং যখন আমি জানতে পারলাম যে এটি সম্পূর্ণ ভিন্ন অর্থে 'ধরাছোঁয়া' ছিল, তখন আমি মন্তব্য করতে বাধ্য হয়েছিলাম। আপনার দুর্দান্ত উত্তরটির বিরুদ্ধে কিছুই নেই (যা আসলে আমি উজ্জীবিত হয়েছিল); আমার সমস্ত ক্ষয়টি পিএইচপি নিজেই ছিল!
পল ডি'আউস্ট

আর আমি ভেবেছিলাম আমি কিছু ;-) উপেক্ষিত থাকেন blog.codinghorror.com/php-sucks-but-it-doesnt-matter : ডি
VolkerK
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.