<html><head><meta http-equiv="Content-Type" content="text/html charset=iso-8859-1"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On 21 jan 2013, at 19:04, Loïc Hoguin <<a href="mailto:essen@ninenines.eu">essen@ninenines.eu</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">Hello,<br><br>Just recently the $handle_undefined_function feature was introduced. It is a way to override error_handler mechanisms when a function isn't found, and works per module for all processes, instead of just one.<br><br>Regardless of the intent behind this feature, the implementation that was pushed to master is in my opinion, and apparently others, deeply flawed. The main issue is that it pushes the responsability of propagating the right errors directly to the user, and the user must use extra care when writing this handler.<br><br></blockquote>This is strange. You think that every one should stay away from this feature, but then you start to play</div><div>around with it your self. Why? Are better suited to handle this abomination than the rest of us or what? </div><div><br><blockquote type="cite">For example this handler would be incorrect:<br><br>$handle_undefined_function(monitor, [process, Pid]) -><br>    do_something();<br>$handle_undefined_function(demonitor, Pid) -><br>    do_something_else();<br>$handle_undefined_function(F, Args) -><br>    error_handler:raise_undef_exception(?MODULE, F, Args).<br><br>Can you see why?[1] If it's not obvious to you, then perhaps this feature needs more work.<br><br></blockquote>What is the fix? ...</div><div><br><blockquote type="cite">My proposal is to use an attribute to list the functions defined like this, so that error_handler can make the distinction between undef and badarg directly. The above function would then be written like this:<br><br></blockquote>Wow, you really want to contribute to the development of Erlang.</div><div><br><blockquote type="cite">$handle_undefined_function(monitor, [process, Pid]) -><br>    do_something();<br>$handle_undefined_function(demonitor, Pid) -><br>    do_something_else().<br><br>And the issue would be gone.<br><br>Adding an attribute isn't hard, whether you generate code or not, and it can be used by tools to figure out what's going on with the module, providing better integration.<br><br>And why not just use -export and still allow -spec anyway? The function is exported, has specs, but is just defined elsewhere. I'm sure there can be a simple solution that fits a lot better the existing toolbase.<br><br></blockquote>Now we are getting creative and cooperative, I like that.</div><div><br></div><div>Here is a smiley for you </div><div><br></div><div>:-)</div><div><br></div><div>/Tony</div><div><br><blockquote type="cite">[1] The answer is: if the first argument to 'monitor' is anything other than the atom 'process', then an undef error will be triggered instead of 'badarg'.<br><br>-- <br>Loïc Hoguin<br>Erlang Cowboy<br>Nine Nines<br><a href="http://ninenines.eu">http://ninenines.eu</a><br>_______________________________________________<br>erlang-questions mailing list<br>erlang-questions@erlang.org<br>http://erlang.org/mailman/listinfo/erlang-questions<br></blockquote></div><br><div>
<span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px; "><div><span class="Apple-style-span" style="color: rgb(51, 51, 51); font-family: Geneva, Arial, Helvetica, sans-serif; font-size: 12px; ">"Installing applications can lead to corruption over time. </span><span class="Apple-style-span" style="color: rgb(51, 51, 51); font-family: Geneva, Arial, Helvetica, sans-serif; font-size: 12px; ">Applications gradually write over each other's libraries, partial upgrades occur, user and system errors happen, and minute changes may be unnoticeable and difficult to fix"</span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 51); font-family: Geneva, Arial, Helvetica, sans-serif; font-size: 12px; "><br></span></div></span><br class="Apple-interchange-newline">
</div>
<br></body></html>