PHP İstisna yakalamak değil / Catch blok deneyin

6 Cevap

Ben bu sayfadan bu Örnek 1. çalıştırmak çalışıyorum: http://php.net/manual/en/language.exceptions.php

<?php
function inverse($x) {
    if (!$x) {
        throw new Exception('Division by zero.');
    }
    return 1/$x;
}
try {
    echo inverse(5) . "\n";
    echo inverse(0) . "\n";
} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}
// Continue execution
echo "Hello World\n";
?>

Ancak bunun yerine istenen çıktı alıyorum:

0.2
Fatal error: Uncaught exception 'Exception' with message 'Division by zero.' 
in xxx:
7 Stack trace: #0 xxx(14): inverse(0) #1 {main} thrown in xxx on line 7

Ben kullanıyorum geliştirici ortamı UniServer 3.5 PHP 5.2.3 ile

6 Cevap

Ben sadece bile istisna adını kopyalanan ve henüz onu anlayamadım gibi görünüyordu tam da bu sorun vardı. Bu benim aptalca bir hataydı çıktı ama ben aynı durumda başka biri var ben burada durumda davamı göndermek gerektiğini düşündüm.

I A adlandırılan benim ad benim istisna vardı ve komut B adında bir ad oldu. (Benim komut adı verilen ad olduğu için B!) Sorun \B\A\MyException (PHP) eşittir A\MyException, hangi vardı. \A\MyException: Ben bunu düzeltmek için yapmak zorunda bu gibi görünür böylece istisna adı, ters eğik çizgi (ya da her ne denir) eklemek oldu

Aksi takdirde istisna 7 yerine 4.satıra atılmış olacağını, aynı kod çalıştıran değildir. Net olarak ne kodu?

C # (Csharp) gibi başka bir dilde yapabileceği gibi PHP tipik try {} catch {} blokları kullanamazsınız.

Bunu yaparsanız:

try{
    //division by zero
    $number = 5/0;
}
catch(Exception $ex){
    echo 'Got it!';
}

Sen 'Buldum!' Görmezsiniz mesajı asla. Neden? PHP her zaman "Fırlayan" olmak için bir özel durum ihtiyacı sadece çünkü bulunuyor. Kendi hata işleyicisi ayarlamak ve onunla bir özel durum atmak gerekir.

Bkz set_error_handler fonksiyonu: http://co.php.net/manual/es/function.set-error-handler.php

Ben aşağıdaki yapılandırmaları ile aynı sorun vardı,

PHP 5.2.14 (cli) (built: Aug 12 2010 17:32:30) Copyright (c) 1997-2010 The PHP Group Zend Engine v2.2.0, Copyright (c) 1998-2010 Zend Technologies with eAccelerator v0.9.5.1, Copyright (c) 2004-2006 eAccelerator, by eAccelerator

The solution is to either disable eAccelerator or update it. I tried both and both of the fixes worked. hata https://eaccelerator.net/ticket/242 (NB firefox kendi SSL sertifika şikayet) bildirilmektedir.

Şimdi aşağıdaki yapılandırmaları ile düzgün try catch çalıştırıyorum,

PHP 5.2.4 (cli) (built: Oct 16 2007 09:13:35) Copyright (c) 1997-2007 The PHP Group Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies with eAccelerator v0.9.6.1, Copyright (c) 2004-2010 eAccelerator, by eAccelerator

Benim ilk olsa sen atma / bulaşıcı istisna adına bir yazım hatası var, ancak kodunuzu tam olarak aynı ise ben olup bittiğini tam olarak ne olduğundan emin değilim.

Orijinal senaryodaki aşağıdaki değişikliği deneyin ve sonuçları yapıştırın. Bu biraz daha iyi sorunu teşhis etmenize yardımcı olacaktır.

<?php

//set up exception handler to report what we didn't catch
function exception_handler($exception) {

    if($exception instanceof MyException) {
        echo "you didn't catch a myexception instance\n";

    } else if($exception instanceof Exception) {
        echo "you didn't catch a exception instance\n";

    } else {
        echo "uncaught exception of type: ".gettype($exception)."\n";
    }

    echo "Uncaught exception: " , $exception->getMessage(), "\n";
}

//install the handler
set_exception_handler('exception_handler');

class MyException extends Exception {
}

function inverse($x) {
    if (!$x) {
        throw new MyException('Division by zero.');
    }
    else return 1/$x;
}

try {
    echo inverse(5) . "\n";
    echo inverse(0) . "\n";
} catch (MyException $e) {
    echo 'Caught myexception: ',  $e->getMessage(), "\n";
} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}

// Continue execution
echo 'Hello World';
?>

Xdebug bir ayar var:

xdebug.show_exception_trace = 1

This will force php to output exceptions even in a try catch block. Turn this to 0