Warning: strpos() [function.strpos]: Empty needle in /home/dealer/kasat/pkg/cahir/web/html/lib/plugins/translation2/action.php on line 53

Warning: Cannot modify header information - headers already sent by (output started at /home/dealer/kasat/pkg/cahir/web/html/lib/plugins/translation2/action.php:53) in /home/dealer/kasat/pkg/cahir/web/html/inc/actions.php on line 163
erlang:exceptions [Krystian Bacławski Wiki]
 

Wyjątki - Wyjątki w Erlangu

Błędy wykonania programu

Błąd dopasowania argumentów funkcji

Błąd function_clause:

	Występuje, kiedy dla żadnej z klauzul funkcji nie znaleziono
	dopasowania. Może wystąpić w dwóch przypadkach:
- Zapomniano o rozpatrzeniu jakiegoś przypadku.
- Wywołano funkcję z nieprawidłowymi argumentami.

Przykład:

factorial(N) when N > 0 ->
  N * factorial(N - 1);
factorial(0) -> 1.
 
1> test:factorial(-1).
** exception error: no function clause matching test:factorial(-1)

Błąd wyrażenia dopasowania

Błąd case_clause:

	Występuje, kiedy nie można dopasować wyrażenia do żadnego z dopasowań w
	wyrażeniu ''case''. Oznacza, że zapomniano o rozpatrzeniu jakiegoś
	przypadku.

Przykład:

test1(N) ->
  case N of
-1 -> false;
 1 -> true
  end.
 
1> test:test1(0).
** exception error: no case clause matching 0
 in function test:test1/1

Błąd wyrażenia warunkowego

Błąd if_clause:

	Występuje, kiedy żadne z wyrażeń warunkowych nie obliczyło się do {\tt
	true} w wyrażeniu ''if''. Oznacza, że zapomniano o rozpatrzeniu
	jakiegoś przypadku.

Przykład:

test2(N) ->
  if
 N < 0 -> false;
 N > 0 -> true
  end.
 
1> test:test2(0).
** exception error: no true branch found when evaluating an if expression
  in function foo:test2/1

Błąd dopasowania

Błąd badmatch:

	Występuje, kiedy dopasowanie wzorca zawodzi i nie ma możliwości
	znalezienia innego dopasowania. Często spotykanymi przypadkami
	występowania tego błędu są:
* Próba ponownego związania zmiennej z wartością.
* Nieudana próba rozpakowania krotki.
* Założenie co do wyniku funkcji, która potrafi zwracać wyniki
			w różnych postaciach.

Przykład:

1> N=45.
45
2> {N,M}={23,45}.
** exception error: no match of right hand side value {23,45}
3> Tuple = {1, two, 3}.
{1,two,3}
4> {1, two, 3, Four} = Tuple.
** exception error: no match of right hand side value {1,two,3}

Błąd typu argumentu

Błąd badarg:

	Występuje przy próbie wywołania funkcji wbudowanej, ze złymi
	argumentami.

Przykład:

1> length(helloWorld).
** exception error: bad argument
     in function length/1
         called as length(helloWorld)

Nieznana funkcja

Błąd undef:

	Występuje przy próbie odwołania się do funkcji, która nie została
	zdefiniowana lub wyeksportowana z danego modułu. Z reguły zdrza się
	kiedy:
- Zapomniano wyeksportować funkcji z modułu.
- Zapomniano o podaniu kwalifikatora modułu dla importowanych funkcji.
- Błędzie w nazwie ;-)

Przykład:

1> test:hello().
** exception error: undefined function test:hello/0
2> append_element({a,b,c}, d).
** exception error: undefined function append_element/2

Błąd w wyrażeniu arytmetycznym

Błąd badarith:

	Występuje, kiedy przekazuje się nieprawidłowe argumenty do operatorów
	arytmetycznych. Z reguły występuje przy:
- Próbie podania operatorowi zmiennej związanej z wartością
			złego typu.
- Przy dzieleniu przez zero.

Przykład:

1> 1 + a.
** exception error: bad argument in an arithmetic expression
     in operator +/2
        called as 1 + a
1> 10 / 0.
** exception error: bad argument in an arithmetic expression
     in operator  '/'/2
        called as 10 / 0

Rzucanie wyjątków

Klasy wyjątków

Klasy wyjątków:

  1. error - Pierwotny typ błędu w Erlangu. Wszystkie wbudowane

wyjątki są tej klasy. Rzucany w przypadku, kiedy w programie

			zaszła na prawdę zła sytuacja i nie ma sensu go ratować. Można
			rzucić używając:
erlang:error( Term ).
  1. throw - Wyjątek generowany przez wywołanie funkcji {\tt

throw}. Można na tą klasę patrzeć jak na wyjątki dostępne dla

			programisty. Przeważnie używa się do rzucania wyjątków, które
			chcą być złapane przez programistę.
throw( Term ).
  1. exit - Powoduje zakończenie procesu. Rzuca się przy pomocy

funkcji wbudowanej exit/1 z argumentem oznaczający powód

			zakończenia programu. Używane do sygnalizowania błędów
			między procesami.
exit( Term ).

Łapanie wyjątków

Klauzula ''try \ldots catch''

Składnia:

try Exprs of
  Pattern1 [when Guard1] ->
    ExprBody1;
  ...
  PatternM [when GuardM] ->
    ExprBodyM
catch
  [Class1:]ExceptPattern1 [when ExceptGuard1] ->
    ExceptBody1;
  ...
  [ClassN:]ExceptPatternN [when ExceptGuardN] ->
    ExceptBodyN
after
  FinalExprs
end
	Oczywiście wyrażenie ''try \ldots catch'' ma wartość.
\begin{alertblock}{Exception Driven Programming}
	Wyjątki się przydają, ale nie są przejrzyste. Korzystajcie z nich w
	sposób odpowiedzialny. Pamiętajcie -- nie lubimy
	exception-driver-programming.
\end{alertblock}

Klauzula ''try \ldots catch''

Przykład:

generate_exception(1) -> a;
generate_exception(2) -> throw(a);
generate_exception(3) -> exit(a);
generate_exception(4) -> {'EXIT', a};
generate_exception(5) -> erlang:error(a).
 
demo1() -> [catcher(I) || I <- lists:seq(1,5)].
catcher(N) ->
  try generate_exception(N) of
    Val -> {N, normal, Val}
  catch
    throw:X -> {N, caught, thrown, X};
    exit:X -> {N, caught, exited, X};
    error:X -> {N, caught, error, X}
  end.
 
2> try_test:demo1().
[{1,normal,a},
 {2,caught,thrown,a},
 {3,caught,exited,a},
 {4,normal,{'EXIT',a}},
 {5,caught,error,a}]

Słowo kluczowe ''catch''

Starsza i prostsza metoda łapania wyjątków

Składnia:

Value = catch Expression
	Jeśli wyrażenie obliczy się bez rzucania wyjątkiem typu ''error'' lub
	''exit'', to pod wartość zostaje wpisany wynik wyrażenia. W
	przeciwnym wypadku krotka przechowująca dane o błędzie.  {\bf Uwaga!
	Tracimy część informacji o wyjątku.}

Przykład:

demo2() -> [{I, catch generate_exception(I)} || I <- lists:seq(1,5)].
 
2> exceptions:demo2().
[{1,a},
 {2,a},
 {3,{'EXIT',a}},
 {4,{'EXIT',a}},
 {5,{'EXIT',{a,[{exceptions,generate_exception,1},
  {exceptions,'-demo2/0-lc$^0/1-0-',1},
  {exceptions,'-demo2/0-lc$^0/1-0-',1},
  {erl_eval,do_apply,5},{shell,exprs,6},
  {shell,eval_exprs,6},{shell,eval_loop,3}]}}}]
 
erlang/exceptions.txt · Last modified: 2010/05/07 21:30 by Krystian Bacławski
 
Except where otherwise noted, content on this wiki is licensed under the following license:CC Attribution-Noncommercial-No Derivative Works 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki