<br><br><div class="gmail_quote">On Wed, Nov 16, 2011 at 1:38 AM, Richard Carlsson <span dir="ltr"><<a href="mailto:carlsson.richard@gmail.com">carlsson.richard@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="im">On 2011-11-15 22:56, David Mercer wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
What criteria should I use in deciding whether an error should terminate the<br>
process (exit) or not (error)?  Either way, if not caught, it terminates the<br>
process, and, if caught, it doesn't.  If I'm writing a function and there is<br>
an error, why would I decide, "this error should terminate the process" and<br>
"this error should not"?  The function usually isn't even process-aware;<br>
it's a function that does something; or not, and then it errors.  It doesn't<br>
care whether it is part of a supervision tree or linked web of processes; it<br>
just wants to signal an error, and let the caller decide whether to catch it<br>
or crash.  Why is the erroring function giving a hint to the caller as to<br>
how to handle its errors, and, really, what does the hint even mean, since<br>
it seems to make no effective difference?<br>
</blockquote>
<br></div>
Effectively, no, any uncaught exception of any kind will terminate the process. But using exit(X) indicates that you know this code is running as part of a process which should at this point die unless someone for some even better reason decides to catch the exception, and the value X is something that some other process might be looking for in an 'EXIT' or 'DOWN' message. And of course, 'exit(normal)' has the special meaning of terminating the process just as if it had simply returned from its initial call - any linked processes which are not trapping exit signals will stay alive if they receive an exit signal with the reason 'normal', while any other exit reason will cause them to fail and propagate the same signal. In any case, a process terminating due to an explicit exit(X) is considered to be a controlled termination, and the Erlang error logger will not log this.<br>

<br>
Using error(X), on the other hand, says that you just want to signal an error but with no particular intent of ending the process; it is not possible to proceed, but the caller might want to catch the exception and try something else. Your code has no opinion on what to do on a process level. An uncaught error (or throw) will terminate the process and also bring down any non-error-trapping linked processes, and the error logger will log the crash as an anomalous process termination.<br>
</blockquote><div><br></div><div>I have a problem with this - when you write library routines, or just write a function</div><div>I'm not normally thinking about the process(s) in which the function is called.</div><div>
Whether or not the process exits is a decision made by the caller of a function and not</div><div>the function itself. You can say exit(..) in a function but the caller might trap the</div><div>exit and not die. Therefore if the reader of a function interprets exit(..) as meaning the</div>
<div>process should die, then they might get a nasty surprise later.</div><div><br></div><div>I use exit(..) when a return value is impossible. For example dividing by zero</div><div>is impossible, so I might say:</div><div>
<br></div><div>divide(A,0) -> exit(you_cant_divide_by_zero);</div><div>divide(A, B) -> A/B.</div><div><br></div><div>This *has* to be exit because I cannot return a value.</div><div><br></div><div>factorial(N) when N < 0 -> exit(...)</div>
<div><br></div><div>etc. factorial is not defined over negative integers.</div><div><br></div><div>When do I user error(...)? - not often. I tend to stick to exit(..) and {ok,...}|{error,...}</div><div><br></div><div>Originally (a  long time ago) exit meant "crash with lot of noise and force the programmer</div>
<div>to re-write their code" - trapping exits was used to close-files etc. and clean up</div><div>after a crash.</div><div><br></div><div>/Joe</div><div><br></div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<font color="#888888">
<br>
   /Richard</font><div><div></div><div class="h5"><br>
______________________________<u></u>_________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/<u></u>listinfo/erlang-questions</a><br>
</div></div></blockquote></div><br>