Erlang:有没有比stacktrace上的regexps更好的方法来判断堆栈上是否有东西?

Erlang:有没有比stacktrace上的regexps更好的方法来判断堆栈上是否有东西?,erlang,stack,Erlang,Stack,我正在从事的项目有许多内置的遥测和调试机制,这些机制必须在发行版中可用,但不能被系统的大多数部分使用。我想构建一个宏,在这些方法的顶部调用,如果该方法不是从一组非常有限的模块中调用的,它将抛出一个异常 例如,我有一个调试模块,可以用来从控制台操纵系统状态,还有一个web工具,允许管理员检查和更改系统。有些方法是为它们的使用而设计的,但在整个系统的模块中实现,偶尔使用是可以的,但是如果有人错误地将它们作为正常操作的一部分调用,那么这些方法将是有害的 编辑:我尝试了下面的lists:keysearc

我正在从事的项目有许多内置的遥测和调试机制,这些机制必须在发行版中可用,但不能被系统的大多数部分使用。我想构建一个宏,在这些方法的顶部调用,如果该方法不是从一组非常有限的模块中调用的,它将抛出一个异常

例如,我有一个调试模块,可以用来从控制台操纵系统状态,还有一个web工具,允许管理员检查和更改系统。有些方法是为它们的使用而设计的,但在整个系统的模块中实现,偶尔使用是可以的,但是如果有人错误地将它们作为正常操作的一部分调用,那么这些方法将是有害的

编辑:我尝试了下面的lists:keysearch建议,它适用于我可以明确命名的任何模块,这可能是我将要管理的最好的模块。我有一些模块,比如web_foo、web_bar、web_foo_other、web_yippie_ki_yea_mf,来匹配我现在使用的regexp

我可以做如下的事情。我还没有编译这个。我希望您给出的任何答案都会阻止我将其投入生产


由于Stack是表示方法调用的元组列表,因此可以使用列表:keysearchwebmanager,1,Stack来检查模块是否在堆栈跟踪中。

由于Stack是表示方法调用的元组列表,因此可以使用列表:keysearchwebmanager,1,堆栈以检查模块是否在堆栈跟踪中。

从您的描述中,我看不出为什么不在不同的facade模块或进程后面隔离操作支持功能和调试功能。这些进程代码可以根据其属性(例如注册名称全局、本地、gproc或节点名称)限制调用方

-module(adm_facade).
-export([register_admin_mode_proc/0,
         unregister_admin_mode_proc/0,
         adm1/1
       ]).

register_admin_mode_proc() ->
    register(admin_mode_proc, self()).

unregister_admin_mode_proc() ->
    unregister(admin_mode_proc).

adm(X) ->
    check_adm(),
    some_other_module:adm(X).

check_adm() ->
    Caller = self(),
    case erlang:whereis(admin_mode_proc) of
        Caller -> ok;
        _ -> erlang:error({access_denied, Caller})
    end.

当然,这将管理功能限制为单个调用方,但您可以使用gproc或您自己的注册器。

从您的描述中,我看不出为什么不在不同的facade模块或进程后面隔离操作支持功能和调试功能。这些进程代码可以根据其属性(例如注册名称全局、本地、gproc或节点名称)限制调用方

-module(adm_facade).
-export([register_admin_mode_proc/0,
         unregister_admin_mode_proc/0,
         adm1/1
       ]).

register_admin_mode_proc() ->
    register(admin_mode_proc, self()).

unregister_admin_mode_proc() ->
    unregister(admin_mode_proc).

adm(X) ->
    check_adm(),
    some_other_module:adm(X).

check_adm() ->
    Caller = self(),
    case erlang:whereis(admin_mode_proc) of
        Caller -> ok;
        _ -> erlang:error({access_denied, Caller})
    end.

当然,这将管理功能限制为单个调用方,但您可以使用gproc或您自己的注册器。

所述方法需要在包含它们所检查的数据的特定进程上执行,因此,我无法根据进程ID限制呼叫者的列表。我也曾考虑建立一个消息传递系统来支持这些特定的呼叫,但通信框架非常,非常复数-我没有写这个东西已经失控了,我不需要再添加一个。有问题的方法需要在包含它们检查的数据的特定进程上执行,因此,我无法根据进程ID限制呼叫者的列表。我也曾考虑建立一个消息传递系统来支持这些特定的呼叫,但通信框架非常、非常复杂-我没有写这篇文章,它已经失控,我不需要再添加一个。从我的小Erlang经验来看,它看起来不太像erlang。我认为最好不要使用try-catch。从我的小Erlang经验来看,它看起来不太像Erlang。我认为最好不要使用try-catch。