2010-05-25 23 views
7

Theo mặc định Xdebug sẽ đổ bất kỳ ngoại lệ cho dù nó được bắt hay không:Vô hiệu hóa Xdebug của bán phá giá của ngoại lệ bắt

try { 
    throw new Exception(); 
} 
catch (Exception $e) { 
} 
echo 'life goes on'; 

Với XDebug kích hoạt và các thiết lập mặc định đoạn mã này sẽ thực sự ra giống như sau (được định dạng tốt):

(!) Exception: in /test.php on line 3 Call Stack 
# Time Memory Function Location 1 0.0003 52596 {main}() ../test.php:0 
life goes on 

Có thể tắt hành vi này và chỉ bán phá giá các trường hợp ngoại lệ chưa được nắm bắt?

Xin cảm ơn trước.

CẬP NHẬT: Tôi sắp kết luận rằng đây là lỗi, vì xdebug.show_exception_trace bị tắt theo mặc định nhưng nó không hoạt động như mong đợi (sử dụng Xdebug v2.0.5 với PHP 5.2.10 trên Ubuntu 9.10).

Trả lời

9

Thay đổi tùy chọn xdebug.show_exception_trace (lưu ý rằng tùy chọn này không được bật theo mặc định).

xdebug.show_exception_trace

Type: số nguyên, giá trị mặc định: 0

Khi thiết lập này được thiết lập để 1, Xdebug sẽ hiển thị một stack trace bất cứ khi nào một ngoại lệ được nâng lên - ngay cả khi ngoại lệ này là thực sự bị bắt.

+0

Tôi đồng ý việc này có liên quan đến xdebug.show_exception_trace. Tôi nghĩ rằng khi đặt thành 0, nó sẽ bỏ qua các ngoại lệ bị bắt, nhưng bằng cách nào đó điều này không hoạt động ngay cả khi vô hiệu hóa nó một cách rõ ràng. – nuqqsa

+0

Nói chuyện với Derick trên # php.pecl @ EFNet hoặc sử dụng trình theo dõi lỗi tại http://bugs.xdebug.org/ – Artefacto

+0

Nhận xét cuối cùng này làm cho câu trả lời của bạn hoàn tất :) Tôi chắc chắn sẽ báo cáo lỗi này trong trường hợp tôi có thể vẫn tái tạo nó trong 2.1.0RCx. Cảm ơn. – nuqqsa

1

Nếu mã của bạn được namespaced, khối catch nên tham khảo \Exception-với dấu chéo ngược - nếu không có dấu chéo ngược sau đó PHP sẽ tìm kiếm Exception trong không gian tên hiện tại của bạn. Điều này thường không thành công và ngoại lệ chưa được chuyển đến Xdebug.

Các mã sau vượt qua ngoại lệ đối với Xdebug:

namespace foo; 

try { 
    new \PDO(0); 
} catch (Exception $e) { 
    echo "Caught!"; 
} 
// Fatal error: Uncaught exception... 

Thêm một dấu chéo ngược trước khi ngoại lệ sẽ tìm kiếm (và tìm) Exception trong không gian tên toàn cầu:

namespace foo; 

try { 
    new \PDO(0); 
} catch (\Exception $e) { 
    echo "Caught!"; 
} 
// Exception caught correctly 

ngoại lệ bằng tay ném có thể gây nhầm lẫn (đó là lý do tại sao tôi sử dụng PDO ở trên). Nếu chúng ta cố gắng ném một ngoại lệ từ không gian tên hiện tại, PHP cho chúng ta biết ngoại lệ không tồn tại ở đó:

namespace foo; 

try { 
    throw new Exception(); 
} catch (Exception $e) { 
    echo "Caught!"; 
} 
// Fatal error: Class 'foo\Exception' not found 

Ném một ngoại lệ toàn cầu mà không có một tài liệu tham khảo toàn cầu trong khối catch không khác nhau:

namespace foo; 

try { 
    throw new \Exception(); // global Exception 
} catch (Exception $e) { 
    echo "Caught!"; 
} 
// Fatal error: Uncaught exception 'Exception' in... 

Trong tất cả những điều này, có thể là một ý tưởng tốt để luôn đặt tiền tố vào số Exception của lệnh bắt bằng dấu gạch chéo ngược.

namespace foo; 

try { 
    throw new \Exception(); 
} catch (\Exception $e) { 
    echo "Caught!"; 
} 
// Exception caught correctly 
Các vấn đề liên quan