0

スタックの1つ上のスクリプトの名前を知りたいmatlabスクリプトを書いています。これが必要な理由は、より重い計算を行う前に、ワークスペースに関するいくつかの基本的な事実を表明するために呼び出されるヘルパースクリプトを作成しているためです。また、ヘルパースクリプトは、計算スクリプトを呼び出すときにエラーメッセージを表示できる必要があります。

mfilenameとを使ってみましdbstackたが、ヘルパースクリプトの名前以外は何も得られません。

さらに説明すると、次のスクリプトがあります。

  • verify_base_conditions:ヘルパースクリプト、の最初の行の1つで呼び出されます
  • heavy_stuff_calculation
  • sweet_mother_of_algorithms
  • general_entry_point:セル内の一般的なワークフローを収集するスクリプト

エントリポイントスクリプトをできるだけ小さくし、より重い計算(または実際には数行以上を必要とするもの)をタスクベースの再利用可能なスクリプトにリファクタリングするようにしています。エントリポイントスクリプトから、このスクリプトを実行するための呼び出しsweet_mother_of_algorithmsと基本条件が満たされていない場合、次のようなエラーメッセージが表示されます。

Error: this_cool_var must be defined when running sweet_mother_of_algorithms
general_entry_point line 15

使ってみました

error(['this_cool_var must be defined when running ' mdfilename])

および他の同様の構造ですが、エラーメッセージに。以外のことを言わせることができませんでしたverify_base_conditions

スタックの1つ上のレベルで実行されているスクリプトの名前を見つけるにはどうすればよいですか?

(注:スタックの一番下で実行されているスクリプトを見つけることには興味がありません。ほとんどの場合、そうなります。呼び出されたスクリプトの名前を取得することに興味があります。)general_entry_pointverify_base_conditions

4

1 に答える 1

1

dbstackこれのために働くはずです。これはあなたの設定に類似していると思います。

a.m:
  b;

b.m:
  c;

c.m:
  stack = dbstack;
  for i=1:3
    disp(stack(i));
  end

を実行するa;と、これはスタック全体を出力します。これには、b(これはあなたが望んでいたと思いますが、呼び出しスタックの2番目に上位の項目が含まれます)。

あるいは、これはおそらくまったく同じ結果をもたらしますが、エラーをスローしてキャッチし、そのスタックを確認することができます。

c.m:
  try
    error('What is on the call stack?');
  catch e
    for i=1:3
      disp(e.stack(i));
    end
  end
于 2012-04-11T13:53:20.740 に答える