![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 214 Pomógł: 0 Dołączył: 3.04.2004 Skąd: Legionowo Ostrzeżenie: (0%) ![]() ![]() |
Witam!
Jestem w trakcie tworzenia obiektowego skryptu w php5. Zacząłem od własnego sterownika bazy danych. Napisałem taki kod:
W dwóch sytuacjach użyłem rzucania wyjątków w przypadku błedu (łączenie z bazą i wybieranie bazy). Chciałem też dać obsługe wyjątków do innych funkcji, np. query(), ale jakoś nie wyobrażam sobie później takiego wykonywania zapytań:
Jest jakiś sposób na rzucanie wyjątków, żeby nie trzeba było ich później za każdym razem obsługiwać w kodzie? I czy warto rzucać wyjątki w przypadku takiej funkcji jak query(), lub numRows()? Ten post edytował zbig13 27.03.2006, 07:56:12 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 338 Pomógł: 2 Dołączył: 4.03.2006 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Nie rozumiem, dlaczego query to zle miejsce na wyjatek. Jak dla mnie idealne.
Mozesz tobic tak:
albo, majac wyjatki w query:
Czy to nie jest wygodne? |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 214 Pomógł: 0 Dołączył: 3.04.2004 Skąd: Legionowo Ostrzeżenie: (0%) ![]() ![]() |
Nie rozumiem tych Twoich przykładów. Mi chodzi po prostu o to, żeby w tej funkcji:
dodać rzucenie wyjątku jeśli nie uda się wykonać zapytania. Mogę zrobić tak jak w funkcji DBMySQL::connect(), ale wtedy przy każdym wykonaniu zapytanie będe musiał pisać:
A wolałbym prościej:
|
|
|
![]()
Post
#4
|
|
Grupa: Przyjaciele php.pl Postów: 5 724 Pomógł: 259 Dołączył: 13.04.2004 Skąd: N/A Ostrzeżenie: (0%) ![]() ![]() |
Cytat A wolałbym prościej: .... przeciez i tak bedziesz musial sprawdzic czy zaputanie sie powiodlo, np.
nie musisz lapac wyjatkow po kazdym zapytaniu, tylko otaczasz try/catch od laczenia sie z baza, poprzez wybieranie bazy, zapytania az dorozlaczenia. No chyba ze potrzebujesz to zrobic inaczej. |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 214 Pomógł: 0 Dołączył: 3.04.2004 Skąd: Legionowo Ostrzeżenie: (0%) ![]() ![]() |
Ok juz rozumiem. Dzięki za pomoc (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
|
|
|
![]()
Post
#6
|
|
Grupa: Przyjaciele php.pl Postów: 2 923 Pomógł: 9 Dołączył: 25.10.2004 Skąd: Rzeszów - studia / Warszawa - praca Ostrzeżenie: (0%) ![]() ![]() |
Dorzuc tam transakcjem, logowanie czasow zapytania i explain
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 214 Pomógł: 0 Dołączył: 3.04.2004 Skąd: Legionowo Ostrzeżenie: (0%) ![]() ![]() |
Mam jeszcze jedno pytanie w związku z tym rzucaniem wyjątków.
Lepiej sprawdzać w metodzie klasy czy zapytanie się powiodło i w razie błędu wyrzucić wyjątek, czy może nie sprawdzać tego w metodzie klasy a po prostu w skrypcie sprawdzac czy wynik zapytania != false? Bo jak sprawdzam w metodzie, to cały skrypt mam objęty instrukcją try...catch i jak wystąpi jeden wyjątek to cały skrypt zostanie zatrzymany, a głupio trochę zatrzymać cały system jak tylko jedno zapytanie się nie powiedzie. Więc jak lepiej? Cytat(SongoQ) Dorzuc tam transakcjem, logowanie czasow zapytania i explain A co to są transakcje? (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) |
|
|
![]()
Post
#8
|
|
Grupa: Przyjaciele php.pl Postów: 2 923 Pomógł: 9 Dołączył: 25.10.2004 Skąd: Rzeszów - studia / Warszawa - praca Ostrzeżenie: (0%) ![]() ![]() |
Cytat A co to są transakcje? W google znajdziesz. Dziwie sie ze w ogole zapytales, bo to jest podstawa relacyjnych baz danych. To tak jak bys pytal co to FOR w C |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 214 Pomógł: 0 Dołączył: 3.04.2004 Skąd: Legionowo Ostrzeżenie: (0%) ![]() ![]() |
Ok, już dodałem (kod w moim pierwszym poście) tylko nie wiem czy jest to przydatne w skrypcie, bo przecież zanim się doda jakieś dane do bazy to trzeba to sprawdzić wszystkimi możliwymi sposobami (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) więc raczej nie ma potrzeby cofania zapytań. (przynajmniej mi się nigdy coś takiego nie zdarzyło)
A masz jakieś sugestie co do pierwszego pytania? (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 338 Pomógł: 2 Dołączył: 4.03.2006 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Jest bardzo wiele sytuacji w ktorzych korzystasz z transakcji. Sprzojrz na przyklad:
Kod zapytanie = wstaw do bazy nowa glaerie; if(baza->wykonaj(zaptanie)) { if(!utworz_katalog(strona/katalogi/uzytownik/nowa_galeria)) { // okazalo sie nie nie mogl go utworzyc. zapytanie = usun z bazy wczesniej dodana galerie. if(!baza->wykonaj(zaptanie)) { no i spojnosc danych poszla sie..;) } } } Z wykorzystaniem stansakcji Kod start_transakcji; zapytanie = wstaw do bazy nowa glaerie; if(baza->wykonaj(zaptanie)) { if(!utworz_katalog(strona/katalogi/uzytownik/nowa_galeria)) { // okazalo sie nie nie mogl go utworzyc. abort; } else commit; } commit mozna w zasadzie pominac, bo zazwyczaj w bazie ustawuone jest autocommit i na koncy dane i tak zostana zapisane w bazie. Pozdrawiam. |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 214 Pomógł: 0 Dołączył: 3.04.2004 Skąd: Legionowo Ostrzeżenie: (0%) ![]() ![]() |
No dobra przekonałeś mnie (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
A co do tej funkcji query to chyba nie będe jednak dodawał w niej rzucania wyjątków, bo to troche bezsensu że cały skrypt się zatrzyma w przypadku błędu w zapytaniu. @SongoQ Logowanie czasów zapytania i explain postaram się dodać w najbliższym czasie (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Jeszcze raz dzięki wam za pomoc. Pozdrawiam, Zbig |
|
|
![]()
Post
#12
|
|
Grupa: Przyjaciele php.pl Postów: 2 923 Pomógł: 9 Dołączył: 25.10.2004 Skąd: Rzeszów - studia / Warszawa - praca Ostrzeżenie: (0%) ![]() ![]() |
Mozesz ewentualnie zrobic cos w rodzaju debug zapytania. Ustawiasz sobie jakis config gdzie podajesz max dla zapytania i np przy wersji debug wyswietlasz sobie zapytania ktore przeszly zadany czas a ktore nie, ktore sie wywalaja itd. Tam samo mozesz postapic z explain. Jak sobie zorganizujesz to juz zalezy tylko od Ciebie. Dla mnie np takie rzeczy sa bardzo wazne.
|
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 657 Pomógł: 2 Dołączył: 15.08.2003 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Cytat Bo jak sprawdzam w metodzie, to cały skrypt mam objęty instrukcją try...catch i jak wystąpi jeden wyjątek to cały skrypt zostanie zatrzymany, a głupio trochę zatrzymać cały system jak tylko jedno zapytanie się nie powiedzie. Jak sama nazwa wskazuje, wyjątek służy do informowania o sytuacjach wyjątkowych, czyli takich po wystąpieniu których aplikacja musi być wstrzymana (ewentualnie jakiś blok operacji w aplikacji). Dlatego stwierdzenie, że "trochę głupio jest zatrzymać system" jest samo w sobie bardzo głupie (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Chyba rozumiesz? |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 214 Pomógł: 0 Dołączył: 3.04.2004 Skąd: Legionowo Ostrzeżenie: (0%) ![]() ![]() |
Tak rozumiem, dlatego zrezygnowałem z wyjątków w funkcji query (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
|
|
|
![]()
Post
#15
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%) ![]() ![]() |
Cytat(Vengeance @ 2006-03-28 20:42:59) Cytat Bo jak sprawdzam w metodzie, to cały skrypt mam objęty instrukcją try...catch i jak wystąpi jeden wyjątek to cały skrypt zostanie zatrzymany, a głupio trochę zatrzymać cały system jak tylko jedno zapytanie się nie powiedzie. Jak sama nazwa wskazuje, wyjątek służy do informowania o sytuacjach wyjątkowych, czyli takich po wystąpieniu których aplikacja musi być wstrzymana (ewentualnie jakiś blok operacji w aplikacji). Dlatego stwierdzenie, że "trochę głupio jest zatrzymać system" jest samo w sobie bardzo głupie (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Chyba rozumiesz? ~Vengeance mylisz się. Wyjątek jest to nagła styuacja, na którą trzeba zareagować. A przerwanie działania systemu/aplikacji to najgorsza reakcja. Nie można sobie (a przynajmniej nie powinno) zatrzymać działania w fowolnej chwili bo wyskoczył jakiś wyjątek, no właśnie po to wyskoczył żeby nam powiedzieć że musimy zrobić coś inaczej niż planowaliśmy. To zależy od natury wyjątku, ale powinniśmy ładnie dalej poprowadzić aplikacją na tory boczne, które zaprowadzą użytkownika do ładnego ekranu powiadamiającym go o błędzie. Wcześniej możemy wykonać wiele operacji: logować wyjątek, wysyłać maila do admina, ... . Kill process to bardzo zły wybór. |
|
|
![]()
Post
#16
|
|
Grupa: Przyjaciele php.pl Postów: 2 923 Pomógł: 9 Dołączył: 25.10.2004 Skąd: Rzeszów - studia / Warszawa - praca Ostrzeżenie: (0%) ![]() ![]() |
Cytat To zależy od natury wyjątku, ale powinniśmy ładnie dalej poprowadzić aplikacją na tory boczne, które zaprowadzą użytkownika do ładnego ekranu powiadamiającym go o błędzie. Wyjatek moze rowniez sluzyc jako "redukcja" warunkow, wiec dokladnie zejscie na tory boczne jest tylko w wiekszosci przypadkow. |
|
|
![]()
Post
#17
|
|
Grupa: Zarejestrowani Postów: 214 Pomógł: 0 Dołączył: 3.04.2004 Skąd: Legionowo Ostrzeżenie: (0%) ![]() ![]() |
To konkretnie jak lepiej robić? :
- Tam gdzie to możliwe umieszczać wyjątki czy - Unikać wyjątków i zastępować je warunkami |
|
|
![]()
Post
#18
|
|
Grupa: Zarejestrowani Postów: 657 Pomógł: 2 Dołączył: 15.08.2003 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#19
|
|
Grupa: Zarząd Postów: 2 277 Pomógł: 6 Dołączył: 27.12.2002 Skąd: Wołów/Wrocław ![]() |
@ Vengeance - ale już w przypadku
system::createAction( 'news' ); wyrzucenie wyjątku może okazać się nazzwyczaj przydatne. Zawsze wtedy masz możliwośc załadowania innej akcji, zrobienie czegoś innego. Podobnie sytuacja wygląda np. z autoryzacją - nie masz uprawnień, to się zaloguj, i nie ważne jest to, w którym momencie system to zauważył. Ważne, że to dostrzegł, i w zwiazku z tym może coś z tym zrobić. Apropo wyjątków i transakcji - mi osobiście bardzo podoba sie taki przykład:
I niech ktoś w czytelniejszy sposób zapisze transakcje (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) |
|
|
![]()
Post
#20
|
|
Grupa: Zarejestrowani Postów: 657 Pomógł: 2 Dołączył: 15.08.2003 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Ale czy ja mówię, że wyjątki są złe? Przykłady które podałeś są jak najbardziej dobre... i pokazują jak wyjątki są przydatne. Ale czy cieszyłbyś się, gdyby każda funkcja php zamiast np. false w razie błędu zwracała wyjątek? Ja nie... bo nie do tego są wyjątki by stosować je wszędzie gdzie się da. A że temat brzmi "kiedy używać wyjątków" chciałem zwrócić na to uwagę autora
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 25.08.2025 - 04:17 |