有一个类似的问题被问到这个问题,但并没有用相同的术语提出问题。
我正在尝试安全地解码base64二进制文件,在这种情况下,输入可能不是二进制文件,甚至是base64编码。
Erlang说让它崩溃并处理它 - 如果我这样做,那么最有效的方法是什么。效率在这个系统中非常重要。
我知道要避免try / catch,因为它构建了一个完整的堆栈跟踪 - 但是,这个上下文的catch关键字是否合理? catch关键字是更快/更有效吗?
在诸如
之类的功能中safe_decode(Binary) ->
case catch base64:decode(Binary) of
<<Result/binary>> -> {ok, Result};
{'EXIT', _} -> {not_base64, Binary}
end.
这真的比尝试捕获更有效吗?如何在效率很高的系统中最好地处理这种情况,即需要尽可能有效地处理涉及构建堆栈跟踪和/或需要比快乐路径更多处理的崩溃。
我只是在学习二郎,所以也许答案就是盯着我。
答案 0 :(得分:10)
不,反之亦然:避免try
,因为它始终构建堆栈跟踪。 catch
+ erlang:get_stacktrace()
只有在 <html>
<head></head>
<body>
<form action="<?php echo base_url();?>index.php/Vehicle_controller/addfun" method="post">
<table align="center" border="1" cellspacing="8px" cellpadding="8px">
<h1 style="margin-left:44%;">Vehicle owner details</h1>
<tr>
<td>Vehicle type:</td>
<td><select class="veh" name="vehtype">
<option value="nil">Choose below:</option>
<option value="bus" id="bus">Bus</option>
<option value="car" id="car">Car</option>
<option value="bike" id="bike">Two wheeler</option>
</select>
<input type="textbox" name="car" style="visibility:hidden;"/></td>
</tr>
<tr>
<div class="bus">
<td>Bus type:</td>
<td><input type="text" name="type"></td>
</div></tr>
<tr>
<div class="bus">
<td>Owner name:</td>
<td><input type="text" name="name"></td>
</div>
</tr>
<tr>
<div class="bus">
<td>License no:</td>
<td><input type="text" name="license"></td>
</div>
</tr>
<tr>
<div class="bus">
<td>Engine status:</td>
<td><input type="radio" id="success" name="eng" value="success">Success<br>
<input type="radio" id="failed" name="eng" value="failed">Failed</td>
</div>
</tr>
<tr>
<div class="bus">
<td>Purchased on:</td>
<td><input type="date" name="date"></td>
</div>
<tr>
<div class="bus">
<td>Vehicle status:</td>
<td><select name="status">
<option value="nil">choose below:</option>
<option value="using" id="using">Using</option>
<option value="sold" id="sold">Sold</option>
</select></td>
</div>
</tr>
<tr>
<div class="car">
<td>Car model:</td>
<td><input type="text" name="model"></td>
</div></tr>
<tr>
<div class="car">
<td>Owner:</td>
<td><input type="text" name="carname"></td>
</div></tr>
<tr>
<div class="car">
<td>license no:</td>
<td><input type="text" name="carnum"></td>
</div></tr>
<tr>
<div class="car">
<td>Car condition:</td>
<td><input type="radio" name="carradio" value="excellent">Excellent<br>
<input type="radio" name="carradio" value="bad">Bad</td>
</div></tr>
<tr align="center">
<td><input type="submit" value="Submit"></td>
</tr>
</table>
</form>
</body>
</html>
<script>
$(document).ready(function()
{
$("#bus").click(function()
{alert("bkbk");
$(".bus").show(1000,"swing",function(){
});
$(".car").hide(1000,"swing",function(){
});
});
$("#car").click(function()
{
$(".car").show(1000,"swing",function(){
});
$(".bus").hide(1000,"swing",function(){
});
});
});
</script>
要求时才会构建堆栈跟踪。
有关完整报道,请参阅Richard Carlsson在2013-11-05发布的issue,发布到erlang-questions。让我举几个部分:
(执行摘要:例外便宜,但是erlang:get_stacktrace()类 昂贵的;另外,避免捕捉Expr&#39;。)
在许多情况下调用get_stacktrace()当然仍然有效, 例如当进程正在放弃或写崩溃的过程中 信息到日志,或只有很少发生的事情和 堆栈跟踪信息很有用 - 但从不在库函数中 可能在循环中大量使用。
最后,这也是重写旧事件的另一个原因 赶上Expr&#39;进入&#39;试试Expr catch ... end&#39; [...]