Exceptions in PHP - Try/Catch or set_exception_handler?

后端 未结 3 1219
刺人心
刺人心 2020-12-23 10:29

I\'m developing some lower end code in my system that uses multiple child classes of the php exception class. Essentially I have the exceptions broken up to a few categorie

相关标签:
3条回答
  • 2020-12-23 11:07

    From the way it sounds, you will be using set_exception_handler. This will guarantee that all exceptions are handled in the exact same way. There are places to use the try/catch blocks in your application, say if you want to check for a single exception that does not necessarily need to be caught in the same way.

    As far as setting set_exception_handler, I'm not sure if you can set the function to be a method of an object unless it is a static method. It appears that is the case. There is more information at http://us2.php.net/set_exception_handler

    0 讨论(0)
  • 2020-12-23 11:16
    1. Run your web requests through a Front Controller script
    2. call set_exception_handler early in execution (don't forget to account for error_reporting()). set_exception_handler takes as its paramter what php calls a "callback". You can pass an object method like so:

      // $object->methodName() will be called on errors
      set_exception_handler(array($object, 'methodName'));
      
    3. Wrap your dispatching code with try/catch to catch any code that DOES throw exceptions. The catch part of your code will catch all your own codes' exceptions, plus some php errors that didn't generate an exception natively (eg fopen or something), thanks to your set_exception_handler call above. The php manual states:

      The following error types cannot be handled with a user defined function: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, and most of E_STRICT raised in the file where set_error_handler() is called.

    4. Log errors as necessary.

    5. Create an error page template (the "View") that operates on an Exception object (the "Model") and pretty prints the whole stack trace for you, in development. Create a different template that goes to production. Branch on your environment, for example:

      catch(Exception $e) {
          // log error as necessary here.
          if("in developement") {
              // $e would be available to your template at this point
              include "errortemplates/dev.php";
          } else {
              include "errortemplates/prod.php";
          }
      }
      
    0 讨论(0)
  • 2020-12-23 11:16

    There's more specific information about PHP's "callbacks" here. To use a static method, the callback is something like

    <?php
    set_exception_handler(array('MyClass','staticMethod'));
    ?>
    

    To use a method from an instantiated object, it's:

    <?php
    set_exception_handler(array($myObject, 'objectMethod'));
    ?>
    

    And to use a global function, it's just:

    <?php
    set_exception_handler('my_global_function');
    ?>
    
    0 讨论(0)
提交回复
热议问题