Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z łapaniem wyjątków
Forum PHP.pl > Forum > PHP
Gligamesh
Witam

Zrobiłem prostą obsługę wyjątków i błędów. Teoretycznie wszystko działa ale nie rozumiem jednej rzeczy. Dlaczego gdy rzucam mError działa moja metoda (poprawnie) i jednocześnie set_exception_handler (jako drugi) dublując wykonanie całości questionmark.gif

//wersja robocza.

  1. Throw new mError($e, 'mysqli_connection');

  1. namespace libs\core;
  2.  
  3. use Exception;
  4. use ErrorException;
  5.  
  6.  
  7. Class mError extends Exception
  8. {
  9. function __construct($e, string $type = null, string $comments = null)
  10. {
  11. $this->file = $e->getFile();
  12. $this->line = $e->getLine();
  13. $this->type = $type;
  14. $this->comments = $comments;
  15. parent::__construct($e->getMessage(), $e->getCode());
  16.  
  17. $this->eHandler();
  18. }
  19.  
  20. function eHandler()
  21. {
  22. $message = 'Napotkano nieoczekiwany błąd aplikacji.';
  23. $notice = 'Przepraszamy, ale nie możemy wyświetlić strony której poszukujesz. Prosimy spróbować ponownie za kilka minut.';
  24.  
  25. switch($this->type) {
  26. case 'not_found':
  27. header("HTTP/1.1 404 Not Found");
  28. header("Status: 404 Not Found");
  29. http_response_code(404);
  30. $message = 'Strony nie znaleziono.';
  31. $notice = 'Przepraszamy, ale strona którą chcesz zobaczyć nie istnieje.';
  32. break;
  33. case 'mysqli_query':
  34. case 'mysqli_connection':
  35. $message = 'Brak połączenia z serwerem MySQL';
  36. break;
  37. }
  38.  
  39. $this -> eDisplay($message, $notice);
  40. }
  41.  
  42. function eDisplay(string $message, string $notice)
  43. {
  44. echo '<!DOCTYPE html>
  45. <html lang="pl">
  46. <head>
  47. <meta charset="utf-8">
  48. <title>'.$message.'</title>
  49. <meta name="robots" content="noindex">
  50. <style type="text/css">
  51. body {font-family: sans-serif; font-size: 14px; margin: 40px;}
  52. fieldset {border: 1px solid #a4a4a4; padding: 10px; background-color: #f2f2f2; margin: 10px 0}
  53. legend {padding: 0 10px; font-weight: bold; }
  54. h1, h3 {font-weight: normal;}
  55. h3 {border-bottom: 1px solid #a4a4a4; padding-bottom: 20px;}
  56. ul {list-style: none; margin: 0; padding:0;}
  57. li {padding-bottom: 4px;}
  58. </style>
  59. </head>
  60. <body>';
  61. echo '<h1>'.$message.'</h1><h3>'.$notice.'</h3>';
  62. if(error_reporting() == E_ALL) {
  63. echo '<ul>'.
  64. '<li>Code: '.$this -> getCode().'</li>'.
  65. '<li>Message: '. $this -> getMessage()."</li>".
  66. '<li>File: '. $this -> file."</li>".
  67. '<li>Line: '. $this -> line."</li>".
  68. //'<li>'.$this -> comments.'</li>',
  69. '</ul>';
  70. if(isset(Bootstrap::$stat)) {
  71. echo '<fieldset><legend> Bootstrap: </legend><pre>';
  72. print_r (Bootstrap::$stat);
  73. echo '</pre></fieldset>';
  74. }
  75. } else {
  76. echo 'Spróbuj <a href="java script: window.location.reload()">odświeżyć stronę</a> lub wróć na <a href="/">stronę główna</a>.';
  77. }
  78. echo '</body></html>';
  79. }
  80. }
  81.  
  82. set_exception_handler(function($exception) {
  83. // echo '<pre>';
  84. // print_r($exception);
  85. // echo '</pre>';
  86. //
  87.  
  88. New mError($exception);
  89. });
  90.  
  91. set_error_handler(function ($errno, $errstr, $errfile, $errline) {
  92. throw new ErrorException($errstr, null, $errno, $errfile, $errline, null);
  93. });
nospor
Nie bardzo rozumiem co cie dziwi... skoro rzucasz wyjatkiem
Throw new mError
i skoro ustawiles ser_exception_handler to logiczne ze ci sie wlacza exception handler

edit:
zamiast tak Throw new mError($e, 'mysqli_connection');
to chyba powinienies robic samo new mError($e, 'mysqli_connection');
by dzialalo jak chcesz
Gligamesh
czyli że handlera uruchamia samo throw ?

new mError() nie przerwie działania skryptu.



nospor
Cytat
czyli że handlera uruchamia samo throw ?
No aniby ty myslales ze co go uruchamia?

Cytat
new mError() nie przerwie działania skryptu.

No to rzucaj normalny wyjatek a wyswietlaniem bledu zajmiesz sie w set_exception_handler a nie w konstruktorze mError... no naprawde nie widzisz tej duplikacji ktora robisz?
Gligamesh
Normalnego wyjątku nie rzucę bo nie da się (lub ja nie umiem) zdefiniować w tym przypadku $type i $comments. Zastąpienie $message nie wchodzi w grę.


BTW: wiesz że nie ładnie jest odpowiadać pytaniem na pytanie ? łachy nie robisz.
nospor
facepalmxd.gif
A gdzie ja bylem niegrzeczny? Jak masz okres to nie czytaj postow na forum bo widze troche nadwrazliwy jestes wtedy (o, teraz mozesz powiedziec ze jestem niegrzeczny, ale to jest nastepstwo twojej 'prowokacji' biggrin.gif ).

Powodzenia na dalszej drodze zycia.

edit:
Cytat
wiesz że nie ładnie jest odpowiadać pytaniem na pytanie ? łachy nie robisz.

a wiesz, ze nie ladnie jest edytowac wlasne posty, gdy ktos juz na nie odpowiedzial?? Teraz moj post nie ma sensu, haha

poza tym nie odpowiedzialem pytaniem na pytanie. Wpierw udzielilem ci odpowiedzi. Ale widze troche niedowidzisz i czytasz tylko wybiorczo posty :/
Gligamesh
Jeśli ktoś pyta, znaczy że nie wie. Oczekuje odpowiedzi, chociaż prostej TAK / NIE, na pytanie nie odpowiada się pytaniem. Jeśli przypomnienie o dobrych zasadach nazywasz prowokacją no to jak sam napiłeś "powiedzenia".

Nie jestem przewrażliwiony tylko nie lubię zbędnego filozofowania. Udzieliłeś odpowiedzi na moje pytanie, dziękuje (kliknąłem nie w ten post). Nie wiem tylko po co te "nie trafione" sugestie, jeśli da się inaczej / lepiej to napisz konkretnie.

Cytat
a wiesz, ze nie ladnie jest edytowac wlasne posty, gdy ktos juz na nie odpowiedzial?? Teraz moj post nie ma sensu, haha

Mój post: 26 minut temu, edycja 16 minut temu , Twój: 10 minut temu
nospor
Cytat
Mój post: 26 minut temu, edycja 16 minut temu , Twój: 10 minut temu
Nie wnikam. Wiem ze jak pisalem mojego posta, to twoja tresc wygladala inaczej.
Tak czy siak nie ladnie jest tak edytowac posta, ze tresc jest zupelnie inna smile.gif

Cytat
Oczekuje odpowiedzi, chociaż prostej TAK / NIE, na pytanie nie odpowiada się pytaniem
Udzielilem ci odpowiedzi. A pytanie bylo tylko dodatkiem, bo nie moglem uwierzyc, ze naprawde nie ogarniasz, iz throw rzuca wyjatkiem.

Cytat
eśli przypomnienie o dobrych zasadach nazywasz prowokacją no to jak sam napiłeś "powiedzenia".

1) Prowokacja nazwalem twoj oryginalny post a nie zmodyfikowany. Widzisz, nazmieniasz, naedytujesz a potem sam sie gubisz. Takze juz sam naocznie widzisz jakie sa wady totalnej edycji tresci
2) Twoj zmodyfikowany post tez nie byl przypomnieniem o dobrych zasadach, gdyz mnie nie dotyczyl. Jak juz nie raz powiedzialem, ja ci udzieliem odpowiedzi. Pytanie bylo tylko malym dodatkiem.
Gligamesh
dobra dobra wystarczy , dostałeś zapomogę więc się nie czepiaj tongue.gif

Cytat
Normalnego wyjątku nie rzucę bo nie da się (lub ja nie umiem) zdefiniować w tym przypadku $type i $comments.

mógłbyś się do tego ustosunkować ?



nospor
mError ma byc samym wyjatkiem. Wowczas mozesz go sobie zdefiniowac jak chcesz i miec parametry jakie chcesz.
A z racji, ze mError bedzie tylko wyjatkiem, to masz z niej wywalic caly mechanizm wyswietlania bledow i inicjalizacji ich wyswietlania. To ma byc w oddzielnej klasie, ktora bedzie odpalana w set_exception_handler
Gligamesh
czyli do handlera ląduje eHandler i eDisplay a jak przekazać dane z mError ?
nospor
No przeciez w handlerze masz wyjatek, ktory wlasnie zostal zgloszony czyli masz mError
Gligamesh
mówisz o czymś takim ? nie rozumiem jak handler ma się dobrać do $type i $comments

  1. Class mError extends Exception
  2. {
  3. function __construct($e, string $type = null, string $comments = null)
  4. {
  5. $this->file = $e->getFile();
  6. $this->line = $e->getLine();
  7. $this->type = $type;
  8. $this->comments = $comments;
  9. parent::__construct($e->getMessage(), $e->getCode());
  10. }
  11.  
  12. }
  13.  
  14. set_exception_handler(function($exception) {
  15. function eHandler() {}
  16. function eDisplay() {}
  17. });
  18.  
  19. set_error_handler(function ($errno, $errstr, $errfile, $errline) {
  20. throw new ErrorException($errstr, null, $errno, $errfile, $errline, null);
  21. });
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.