Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么erlang:get_stacktrace/0在shell中获得不同的输出?_Erlang - Fatal编程技术网

为什么erlang:get_stacktrace/0在shell中获得不同的输出?

为什么erlang:get_stacktrace/0在shell中获得不同的输出?,erlang,Erlang,考虑以下代码: -module(except). -compile(export_all). divone(X)-> erlang:error({badnews,erlang:get_stacktrace()}),1/X-1. tryreturn(X)-> try divone(X) of Val->{result,2/Val} catch exit:Reason->{exit,Reason}; throw:

考虑以下代码:

 -module(except).
 -compile(export_all).

 divone(X)->    erlang:error({badnews,erlang:get_stacktrace()}),1/X-1.
 tryreturn(X)->

      try divone(X) of
     Val->{result,2/Val}
    catch
    exit:Reason->{exit,Reason};
    throw:Throw->{throw,Throw};
    error:Error->{error,Error}
 end.
在shell中测试代码:

 Eshell V5.9.1  (abort with ^G)

 1> c(except).
 {ok,except}
 2> except:tryreturn(10). **%why cant't get stack trace info here?**
 {error,{badnews,[]}}          
 3> except:tryreturn(10). **%why can get here?**
 {error,{badnews,[{except,divone,1,
                     [{file,"except.erl"},{line,4}]},
             {except,tryreturn,1,[{file,"except.erl"},{line,7}]},
             {erl_eval,do_apply,6,[{file,"erl_eval.erl"},{line,576}]},
             {shell,exprs,7,[{file,"shell.erl"},{line,668}]},
             {shell,eval_exprs,7,[{file,"shell.erl"},{line,623}]},
             {shell,eval_loop,3,[{file,"shell.erl"},{line,608}]}]}}

如果没有任何异常,则由
erlang:backtrace()
返回的stacktrace为空

对于您来说,比
erlang:backtrace()
更有用的东西包括指令指针和进程的调用堆栈,而不管您是否捕获了异常

这应该是车票:

io:format("~s~n", [element(2, process_info(self(), backtrace))]).

(当然,self可以与另一个
Pid
自由交换)

如果没有任何异常,则由
erlang:backtrace()
返回的stacktrace为空

对于您来说,比
erlang:backtrace()
更有用的东西包括指令指针和进程的调用堆栈,而不管您是否捕获了异常

这应该是车票:

io:format("~s~n", [element(2, process_info(self(), backtrace))]).
(当然,自我可以与另一个
Pid
自由交换)

根据:

获取调用过程中最后一个异常的调用堆栈回溯跟踪(stacktrace,作为
{Module,Function,Arity,Location}
元组的列表。根据异常情况,第一个元组中的字段Arity可以是该函数调用的参数列表,而不是Arity整数

请注意上面文本中的最后一个例外。在第一次调用期间,还没有任何异常,因此没有任何stacktrace可返回。然后使用
erlang:error/1
生成
error
class[1]异常,因此下一次调用返回上一次调用的stacktrace

如何获取当前代码的stacktrace有一个习惯用法:

try throw(foo) catch foo -> erlang:get_stacktrace() end.
或使用旧的(过时的)方式:

[1] :有三类异常:
抛出
错误
退出
,根据:

获取调用过程中最后一个异常
的调用堆栈回溯跟踪(stacktrace,作为
{Module,Function,Arity,Location}
元组的列表。根据异常情况,第一个元组中的字段Arity可以是该函数调用的参数列表,而不是Arity整数

请注意上面文本中的最后一个例外。在第一次调用期间,还没有任何异常,因此没有任何stacktrace可返回。然后使用
erlang:error/1
生成
error
class[1]异常,因此下一次调用返回上一次调用的stacktrace

如何获取当前代码的stacktrace有一个习惯用法:

try throw(foo) catch foo -> erlang:get_stacktrace() end.
或使用旧的(过时的)方式:


[1] :有三类异常:
throw
error
exit

但是为什么第二次调用会获取stacktrace信息?不需要第二次调用,您可以用io:format语句替换erlang:backtrace()。在第二次运行时可以看到它的原因是,您已经抛出了一个异常,该异常填充了erlang:backtrace()引用的数据结构,但为什么第二次调用会获取stacktrace信息?不需要第二次调用,您可以用io:format语句替换erlang:backtrace()。在第二次运行时可以看到它的原因是,您已经抛出了一个异常,该异常填充了erlang:backtrace()引用的数据结构