Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: try - catch i kontunuowanie
Forum PHP.pl > Forum > PHP
blawat
kod:

  1. try {
  2. $db->insert('tab1', $data1);
  3. $db->insert('tab2', $data2);
  4. $db->insert('tab3', $data3);
  5. $db->insert('tab4', $data4);
  6. $db->insert('tab5', $data5);
  7. ...
  8. ...
  9. } catch (dbException $exc) {
  10. echo $exc->getMessage();
  11. }


zalozenia: odczytuje dane z jednej gigantycznej tabeli i po jakims tam parsowaniu zapisuje je do powiedzmy 100 innych tabeli, kazda insert moze rzucic wyjatek, przy czym chcialbym aby zostala wyswietlona tylko informacje ze dane zapytanie nie przeszlo i caly kod byl kontynuowany dalej...

klu sprawy: chce uniknac pakowania kazdego inserta w osobny try - catch smile.gif da rade? jakos tak ze rzuci bledem cath go wylapie i w magiczny sposob wroci kontynuowac dalej...?
Mephistofeles
Użyj exception handler.
blawat
To nie zalatwi sprawy:

set_exception_handler

Sets the default exception handler if an exception is not caught within a try/catch block. Execution will stop after the exception_handler is called.
Crozin
Dlaczego nie chcesz każdego zapytania objąć blokiem try/catch?
d3ut3r
Idąc za manualem:

  1. <?php
  2. function inverse($x) {
  3. if (!$x) {
  4. throw new Exception('Division by zero.');
  5. }
  6. else return 1/$x;
  7. }
  8.  
  9. try {
  10. echo inverse(5) . "\n";
  11. echo inverse(0) . "\n";
  12. } catch (Exception $e) {
  13. echo 'Caught exception: ', $e->getMessage(), "\n";
  14. }
  15.  
  16. // Continue execution
  17. echo 'Hello World';
  18. ?>


skrypt wyświetli HelloWorld, więc to chyba dokładnie to o co Ci chodzi ?
blawat
Cytat(Crozin @ 15.11.2010, 20:34:19 ) *
Dlaczego nie chcesz każdego zapytania objąć blokiem try/catch?


ze zwyklego lenistwa tongue.gif wiem ze obejcie kazdego inserta zalatwi temat ale chcialem jakos tak "prosciej"
-=Peter=-
Wsadź sobie zapytania i parametry do dwuwymiarowej tablicy i zrób to w pętli, przykładowo:

  1. $queries = arrray(
  2. array('query' => 'INSERT INTO tab VALUES(?, ?, ?)', 'params' => array(...)),
  3. );
  4.  
  5. foreach($quieres as $queryData){
  6. try{
  7. $db->insert($queryData['query'], $queryData['params']);
  8. }catch(Exception $e){
  9. echo 'Błąd egzekucji zapytania "'.$queryData['query'].'"';
  10. }
  11. }
d3ut3r
A nie prościej zmodyfikować metodę insert, tak aby w przypadku błędu od razu wyrzucała w wiadomości w jakim zapytaniu wystąpił błąd ? Wtedy możesz użyć jednego try ... catch
Zyx
Magicznym sposobem, o który pytasz, jest właśnie opakowywanie każdego z zapytań blokiem try...catch. A jak nie chcesz mieć mnóstwa kodu, opakuj to sobie w jakąś funkcję, metodę czy co tam masz i po kłopocie:

  1. function insertExt($db, $foo, $bar)
  2. {
  3. try
  4. {
  5. $db->insert($foo, $bar);
  6. }
  7. catch(Exception $e)
  8. {
  9. ...
  10. }
  11. } // end insertExt();
  12.  
  13. insertExt($db, 'item1', 'tralala');
  14. insertExt($db, 'item2', 'tralala');
  15. insertExt($db, 'item3', 'tralala');
erix
A nie przypadkiem chodzi o to?

http://pl2.php.net/manual/en/pdo.error-handling.php
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.