1

C# に基づくテスト自動化ツールである Ranorex を使用していますが、例外処理と例外の再スローについて質問があります。私はC#プログラミングにかなり慣れていないので、ご容赦ください!次のコードを検討してください。

子クラス/メソッド..

try
{
    do something;
    'unhandled exception on line 150'
}

catch (exception)
{
    throw;
}

親クラス/メソッド

try
{
     childmethod();
}

catch (exception ex)
{
    report.info("Info",ex.Stacktrace);
}

私ができるようにしたいのは、子クラス/メソッドではなく親クラスの例外ハンドラーで、例外が発生した行番号を報告することです。このようにして、すべての子クラス/メソッドで、例外をマスター クラス/メソッド (つまり、Ranorex 用語のテスト ケース) に戻す (スローする) ことができます。親例外ハンドラーでは、システムの詳細を報告したり、アプリケーションを閉じたり、テストに失敗したりするなど、他のことを行う必要があります。これを 1 か所だけで行いたいので、最上位クラスに配置します。ただし、上記のコードを使用すると、stracktrace は再スローされる子例外ハンドラーの行番号と、子メソッドが呼び出された行番号を示します。また、スタックトレースから次のような形式のものを抽出できれば便利です。

Class = 'class name' & Method = 'method name' & Line Num = 'line num' 

スタックトレース メッセージ全体ではなく。

.net v4.0 を使用しています

助けてくれてありがとう。

スタックトレース:

The stacktrace information is: at System.Data.DataRow.GetDataColumn(String columnName)
at System.Data.DataRow.get_Item(String columnName)
at ABCTest.SUD.Plat.NewFU.NewFUUserCode.MainMethod(String testDataInstanceId) in c:\Ranorex Local Code\ABCTest\ABCTest\SUD\Plat\NewFU\NewFUUserCode.cs:line 103
at ABCTest.SUD.Plat.NewFU.NewFUUserCode.MainMethod(String testDataInstanceId) in c:\Ranorex Local Code\ABCTest\ABCTest\SUD\Plat\NewFU\NewFireFUUserCode.cs:line 130
at ABCTest.Tests.ManageFAndS.ManACA_IO_One.MainMethod() in c:\Ranorex Local Code\ABCTest\ABCTest\Tests\ManageFAndS\ManACA_IO_One.cs:line 59
4

1 に答える 1

0

ここhttp://weblogs.asp.net/fmarguerie/archive/2008/01/02/rethrowing-exceptions-and-preserving-the-full-call-stack-trace.aspxに解決策があります。文書化されていない方法に基づいているため、コードで使用するかどうかはわかりません (ただし、.NET 4.0 でも動作します)。

private static void PreserveStackTrace(Exception exception)
{
    MethodInfo preserveStackTrace = typeof(Exception).GetMethod("InternalPreserveStackTrace",
        BindingFlags.Instance | BindingFlags.NonPublic);
    preserveStackTrace.Invoke(exception, null);
}

static void MethodChild()
{
    try
    {
        throw new ArgumentException();
    }
    catch (Exception ex)
    {
        // Very important! Do it before rethrowing
        PreserveStackTrace(ex);
        throw;
    }
}

SO に関するこの応答で問題が説明されました。同じメソッドの 2 つのスタック フレームを使用することはできません。1 つのメソッド = 1 つのスタック フレーム。

例外がスローされた場所に関する情報を取得するには、StackTraceクラスを使用できます。

StackTrace st = new StackTrace(ex, true);
StackFrame frame = st.GetFrame(0);
MethodBase method = frame.GetMethod();

// What you want!
string methodName = method.Name;
string className = method.DeclaringType.FullName;
int lineNumber = frame.GetFileLineNumber();

true例外をコンストラクターに 2 番目のパラメーターとして渡します。

于 2013-08-07T08:50:34.067 に答える