单独或不单独尝试... catch块(最佳实践)

时间:2014-09-22 11:55:12

标签: php try-catch

分离不同的try catch块是否更好,或者我可以在一个块下对一系列类调用进行分组?我目前设置为使用单个块运行并且不会收到任何错误。我主要是为了可读性和未来的证明。

例如,多个块:

    /**  KERNEL AUTOLOAD
 * = check system setup and load autoloader, bootstrap, and magma config  */
try {
    /** AutoLoad Kernel */
    if (!require_once($paths['root']
        . '/' . $paths['framework']
        . '/' . '/kernel/core/KernelLoader.php')) {
        throw new Exception('Error - AutoLoader is missing');
    }
    $kernel_loader = new KernelLoader($paths);
} catch (Exception $e) {
    echo
        '<p><b>EXCEPTION</b><br />Message: '
        . $e->getMessage()
        . '<br />File: '
        . $e->getFile()
        . '<br />Line: '
        . $e->getLine()
        . '</p>';
}

/**  KERNEL BOOTSTRAP
 * = check system setup and load autoloader, bootstrap, and magma config  */
try {
    /** BootStrap */
    if (!$kernel = new BootStrap($paths)) {
        throw new Exception('Error - BootStrap is missing');
    }
} catch (Exception $e) {
    echo
        '<p><b>EXCEPTION</b><br />Message: '
        . $e->getMessage()
        . '<br />File: '
        . $e->getFile()
        . '<br />Line: '
        . $e->getLine()
        . '</p>';
}

/**  APP SETUP
 * = initialize the app */
try {
    /** StartPage */
    if (!$app = new StartPage($kernel)) {
        throw new Exception('Error - App StartPage is missing');
    }
} catch (Exception $e) {
    echo
        '<p><b>EXCEPTION</b><br />Message: '
        . $e->getMessage()
        . '<br />File: '
        . $e->getFile()
        . '<br />Line: '
        . $e->getLine()
        . '</p>';
}

或单个捕获块:

/**  KERNEL AUTOLOAD
 * = check system setup and load autoloader, bootstrap, and magma config  */
try {
    /** AutoLoad Kernel */
    if (!require_once($paths['root']
        . '/' . $paths['framework']
        . '/' . '/kernel/core/KernelLoader.php')) {
        throw new Exception('Error - AutoLoader is missing');
    }
    $kernel_loader = new KernelLoader($paths);

    /** BootStrap */
    if (!$kernel = new BootStrap($paths)) {
        throw new Exception('Error - BootStrap is missing');
    }

    /** StartPage */
    if (!$app = new StartPage($kernel)) {
        throw new Exception('Error - App StartPage is missing');
    }        
} catch (Exception $e) {
    echo
        '<p><b>EXCEPTION</b><br />Message: '
        . $e->getMessage()
        . '<br />File: '
        . $e->getFile()
        . '<br />Line: '
        . $e->getLine()
        . '</p>';
}

1 个答案:

答案 0 :(得分:2)

这在语义上完全取决于代码块正在做什么以及如何根据正在执行的业务逻辑处理错误。 (不应该如何抓住,但应该如何处理。)例如:

  • 这两个操作都是单个原子业务操作的一部分吗?在这种情况下,第二个操作中的错误可能需要触发作为单个工作单元的一部分的两个操作的回滚。在这种情况下,将它们组合在一起是有意义的。 (一个catch阻止。)
  • 这些是原子分离且不同的操作吗?在这种情况下,第二操作中的错误可能没有逻辑过程来影响第一操作,因此应该单独处理。 (两个catch块。)

在语义上将您的操作分离到他们自己的关注点,然后处理这些问题中的错误。