<p>(including the ML with this one)</p>
<p>Hi Rudolph,</p>
<p>With a situation like this, the more canonical Erlang approach is to do something like: on success, return {ok, Pid} and on failure return the atom 'error'.</p>
<p>Then the spec would simply be:</p>
<p>-spec where(G::atom()) -> {ok, pid()} | error.</p>
<p>Then you can trivially use it in a case statement and use pattern matching.</p>
<p>Using a combination of throw and try blocks as intended behavior for control flow is a recipe for confusion.</p>
<p>-Jesse</p>
<div class="gmail_quote">On Apr 2, 2013 12:22 AM, "Rudolph van Graan" <<a href="mailto:rvg.mailing@me.com">rvg.mailing@me.com</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div style="word-wrap:break-word">Hi, <div><br></div><div>I want to write a type spec for a function that throws exceptions, something like this:</div><div><br></div><div><blockquote type="cite">-spec where(G :: atom()) -> pid() | throw({no_name,atom()}).<br>
</blockquote><div><br></div>I don't want to use an exit signal, because this behaviour is intentional and the calling process will catch this and take specific action.  But I can't write this using the -spec syntax. The documentation says:</div>
<div><span style="font-family:Verdana,Arial,Helvetica,sans-serif"><br></span></div><div></div><blockquote type="cite"><div><span style="font-family:Verdana,Arial,Helvetica,sans-serif">Some functions in Erlang are not meant to return; either because they define servers or because they are used to throw exceptions as the function below:</span></div>
<div><div style="background-color:rgb(238,238,255);padding:0px 10px;font-family:Verdana,Arial,Helvetica,sans-serif"><pre style="font-family:Courier,monospace">  my_error(Err) -> erlang:throw({error, Err}).</pre></div><p style="font-family:Verdana,Arial,Helvetica,sans-serif">
For such functions we recommend the use of the special <span style="font-family:Courier,monospace">no_return()</span> type for their "return", via a contract of the form:</p><div style="background-color:rgb(238,238,255);padding:0px 10px;font-family:Verdana,Arial,Helvetica,sans-serif">
<pre style="font-family:Courier,monospace">  -spec my_error(term()) -> no_return().</pre></div></div></blockquote><div><div><br></div><div>no_return() is completely the wrong thing to use and just leaving out the throw(…) declaration is also wrong in my eyes. How do I do this?</div>
<div><br></div><div>Thanks,</div><div>
<span style="border-collapse:separate;font-family:'Courier New';border-spacing:0px"><span style="text-indent:0px;letter-spacing:normal;font-variant:normal;text-align:-webkit-auto;font-style:normal;font-weight:normal;line-height:normal;border-collapse:separate;text-transform:none;font-size:medium;white-space:normal;font-family:'Courier New';word-spacing:0px"><div style="word-wrap:break-word">
<div><div style="word-wrap:break-word"><p style="font-family:Arial;font-size:11px;line-height:1.4em;margin-top:10px;margin-right:0px;margin-bottom:0px;margin-left:0px;letter-spacing:1px;color:rgb(0,105,141);font-weight:bold">
<span style="font-weight:normal">Rudolph van Graan</span></p></div></div><div><br></div></div></span><br></span><br>
</div>
<br><div>
<span style="text-indent:0px;letter-spacing:normal;font-variant:normal;text-align:-webkit-auto;font-style:normal;font-weight:normal;line-height:normal;border-collapse:separate;text-transform:none;font-size:medium;white-space:normal;font-family:'Courier New';word-spacing:0px"><span style="text-indent:0px;letter-spacing:normal;font-variant:normal;text-align:-webkit-auto;font-style:normal;font-weight:normal;line-height:normal;border-collapse:separate;text-transform:none;font-size:medium;white-space:normal;font-family:'Courier New';word-spacing:0px"><div style="word-wrap:break-word">
<div><div style="word-wrap:break-word"><div><p style="font-family:Arial;font-size:11px;line-height:1.4em;margin-top:10px;margin-right:0px;margin-bottom:0px;margin-left:0px;letter-spacing:1px;color:rgb(0,105,141);font-weight:bold">
<br></p></div></div></div></div></span><br></span><br>
</div>
<br></div></div><br>_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
<br></blockquote></div>