-1

2 つの例外をスローしたいコードがあります。ただし、例外は基本的に同じですが、値が異なります。これらのエラーのどれが発生したかを判断するためのエレガントで一般的な方法を知りたいです。

2 つの try catch を実行できること、またはクエリの成功を判断するためにブール値を設定できることはわかっています。これは 1 つのクエリで実行できることも認識しています。ただし、会社のキーが間違っていたのか、それとも PA ID が間違っていたのかを判断できるようにする必要があります。また、独自の例外を作成し、それにフィールドを追加できることも知っています。残念ながら、これらのどれもが最適な解決策であるとは思えず、これはかなり長い間私を悩ませてきました.

ベストプラクティスに関する情報をいただければ幸いです。

using (var ora = new OracleConnection(Data.ConnectionString))
{
    String sqlGetCompanyId = "SELECT COMPANY_ID FROM companies WHERE key = :key";
    String sqlValidateDelete = "select * from pa where PA_ID = :paid AND COMPANY_ID = :cid";

    ora.Open();
    int CompanyId = 0;

    using (var Command = ora.CreateCommand())
    {
        Command.CommandText = sqlGetCompanyId;
        Command.Parameters.Add(":key", OracleDbType.Varchar2).Value = cKey;

        using (var reader = Command.ExecuteReader(CommandBehavior.SingleRow))
        {
            if (reader.Read())
               CompanyId = unchecked((int)((long)reader["COMPANY_ID"]));
            else
               throw new ArgumentException("Invalid Company Key");
        }
     }

     using (var Command = ora.CreateCommand())
     {
         Command.CommandText = sqlValidateDelete;
         Command.Parameters.Add(":cid", OracleDbType.Int32).Value = CompanyId;
         Command.Parameters.Add(":paid", OracleDbType.Int32).Value = PAID;

         using (var reader = Command.ExecuteReader(CommandBehavior.SingleRow))
         {
             if (!reader.Read())
                throw new ArgumentException("Price Agreement Id for this company does not exist");
             rv = unchecked((int)((long)reader["ROW_VERSION"]));
         }
      }
   }
4

3 に答える 3

1

それぞれにカスタム例外を作成することをお勧めします。

public class InvalidCompanyKeyException : ArgumentException {
   public InvalidCompanyKeyException() : base() {}
   public InvalidCompanyKeyException(string message) : base(message) {}
   public InvalidCompanyKeyException(string message, Exception inner) : base(message, inner) {}
}

public class PriceAgreementIdNotFoundException : ArgumentException {
   public PriceAgreementIdNotFoundException() : base() {}
   public PriceAgreementIdNotFoundException(string message) : base(message) {}
   public PriceAgreementIdNotFoundException(string message, Exception inner) : base(message, inner) {}
}

これらを個別にキャッチすることも、いずれかを としてキャッチすることもできますArgumentExceptionMicrosoft が推奨しているため、例外ごとに 3 つの個別のコンストラクターを含めました。また、特定のシナリオで使用される場合は、例外をシリアル化可能にすることをお勧めしますが、例ではシリアル化が必要ないようです。

于 2013-08-19T18:20:39.213 に答える
1

独自の例外を定義するのはどうですか

public class MyException : ArgumentException
{
    public MyException(string s) : base(s)
    {
    }
    public int MyValue { set; get; }
}

そしてそれを次のように使用しますthrow new MyException("Some Message") { MyValue = 666 };

于 2013-08-19T18:08:28.887 に答える