1

パラメータを catch ブロックに渡すことは可能ですか? コード例を次に示します。

try 
{           
    myTextBox.Text = "Imagine, that could fail";
}
catch (Exception e)
{
    MessageBox.Show(e.Message); 
}

失敗した場合、Textbox ( myTextBox ) を catch ブロックに渡すことはできますか? ちょっと。そのように:

try 
{           
    myTextBox.Text = "Imagine, that could fail";
}
catch (Exception e, TextBox textBox)
{
    textBox.BorderBrush = Colors.Red;
    MessageBox.Show(e.Message); 
}

どうすればそれを行うことができますか?

4

4 に答える 4

6

catchC#では。でなければならないのは1つだけExceptionです。したがって、直接ではありません。でも!Exceptionたとえば、カスタムの場合SomethingSpecificExceptionは、その情報をで利用できるようにすることができますe.SomeProperty

public class SomethingSpecificException : Exception {
    public Control SomeProperty {get;private set;}
    public SomethingSpecificException(string message, Control control)
          : base(message)
    {
       SomeProperty = control;
    }
    ...
}

次に、ある時点で次のことができます。

throw new SomethingSpecificException("things went ill", ctrl);

catch(SomethingSpecificException ex) {
    var ctrl = ex.SomeProperty;
    ....
}
于 2012-05-14T07:05:56.283 に答える
6

いいえ、標準では不可能です。

できることは、カスタム例外を定義し、そこにパラメーターを割り当てることです。次に例を示します。

public class MyCustomException : Exception
{
    public string SomeAdditionalText {get;set;}
    ....
    //any other properties
    ...
}

例外を発生させるメソッド内で、独自の例外を発生させますMyCustomException

于 2012-05-14T07:03:57.110 に答える
1

何を達成したいのかわかりませんが、try ブロックで行うように、catch ブロックでは任意の UI 要素にアクセスできます。したがって、私にとっては、catch ブロックで追加のパラメーターを定義する意味はありません。

于 2012-05-14T07:04:14.960 に答える
0

何が起こっているのかを区別するためにカスタム例外を使用する可能性に続いて:

try
{
    myClass.DoSomethingThatCouldThrow();
    myClass.DoSomethingThatThrowsSomethingElse();
    myClass.DoAnotherThingWithAThirdExceptionType();
}
catch(FirstSpecialException ex)
{
    // Do something if first fails...
}
catch(SecondSpecialException ex)
{
    // Do something if second fails...
}

すべてのステートメントを独自の例外ブロックに入れることもできます。これにより、コードが非常に長くなりますが、クラスを変更して特別な例外をスローできない場合は、おそらくこれが唯一の可能性です。

try
{
    myClass.DoSomethingThatCouldThrow();
}
catch(InvalidOperationException ex)
{
    // Do something if it fails...
}

try
{
    myClass.DoSomethingThatCouldThrow();
}
catch(InvalidOperationException ex)
{
    // Do something if it fails...
}

try
{
    myClass.DoAnotherThingWithAThirdExceptionType();
}
catch(InvalidOperationException ex)
{
    // Do something if it fails...
}

この最後のコードは反復コードに少し似ているため、次の本体を持つメソッドに入れることができます。

public void TryCatch<ExceptionT>(Action tryMethod, Action<ExceptionT> catchMethod)
    where ExceptionT : Exception
{
    // ToDo: ArgumentChecking!

    try
    {
        tryMethod();
    }
    catch(ExceptionT ex)
    {
        catchMethod(ex);
    }
}

次に、次のように呼び出すことができます。

TryCatch<InvalidOperationException>(
    () => myClass.DoSomething(),
    (ex) => Console.WriteLine(ex.Message));
于 2012-05-14T07:12:39.680 に答える