如何确定代码是作为函数执行还是使用单元格模式执行

时间:2013-02-01 14:57:06

标签: debugging matlab

我喜欢在编写/调试函数时使用cell mode而不是断点。

如何在运行时确定当前正在执行的代码是作为函数执行还是使用单元格模式执行?

奖励积分如果你能提出一个function,它知道它是从另一个函数或一个单元格中调用的。

这可能有用的一个示例是,您希望在执行函数期间以不同方式加载数据,或者是否要创建用于调试的绘图仪。在作为单元格或函数执行时切换时,注释掉特定行会变得很痛苦。

function doSomethingAwesome(inputs)
%%

if executingAsCell == true
  clear
  importData
end


% process stuff

if executingAsCell == true
   plot(myAwesomeResults)
end

请注意,这与我之前的问题不重复: How to determine if code is executing as a script or function?

1 个答案:

答案 0 :(得分:2)

最简单的方法是使用@Junuxx建议的dbstack()

if isempty(dbstack)
   %# true if you evaluated the cell while not in debug mode

类似地,函数可以通过检查dbstack的长度来知道它是从另一个函数调用还是从base / cell调用

   function doSomething
   if length(dbstack)==1
      %# the function has been invoked from a cell or the command line
      %# (unless you're in debug mode)

函数实际上可以区分它是从命令行还是从单元格调用,因为后者不会写入历史记录:

   function doSomething

   if length(dbstack)==1
      javaHistory=com.mathworks.mlservices.MLCommandHistoryServices.getSessionHistory;
      lastCommand = javaHistory(end).toCharArray'; % ' added for SO code highlighting
      if strfind(lastCommand,'doSomething')
         %#  Probably invoked via command line
      else
         %#  Probably invoked via executing a cell

如果你想确定你是否处于调试模式,一种可能性是使用dbstack中的line - 参数,并检查是否有对该行当前正在执行的函数的调用明显的呼叫功能。