0

最善を尽くしても、Decrypt メソッドによってスローされる例外を修正することはできませんでした。データをバイトのバッファー配列に変換している行で、ArgumentNullException がスローされています。最初に追加しました:

if (String.IsNullOrEmpty(data))
{
    throw new ArgumentNullException ("Null data");
}

パスワードについても同様に、同じコードを実行しました。次に、同じ例外が if ステートメントでポップアップした後、以下の try-catch ステートメントに変更しました。現在、例外は try-catch 行ではポップアップしませんが、代わりに Decrypt のバッファー変換行でポップアップします。try-catch でうまくいくと思っていたので、プログラムが何を望んでいるかはよくわかりませんが、私は C# にもかなり慣れていないので、明らかな何かが欠けている可能性があります。

public static string Encrypt (string data, string password)
    {
        if (String.IsNullOrEmpty(data as string))
        {
            throw new ArgumentException("Null data.");
        }

        if (String.IsNullOrEmpty(password as string))
        {
            throw new ArgumentException("Null password.");
        }

        using (SymmetricAlgorithm alg = GetAlgorithm(password))
        using (MemoryStream ms = new MemoryStream())
        using (CryptoStream cs = new CryptoStream (ms, alg.CreateEncryptor(), CryptoStreamMode.Write))
        {
            byte[] buffer = Encoding.UTF8.GetBytes(data);
            cs.Write(buffer, 0, buffer.Length);
            cs.FlushFinalBlock();
            return Convert.ToBase64String(ms.ToArray());
        }
    }

    public static string Decrypt (string data, string password)
    {
        try
        {
            String.IsNullOrEmpty(data);
        }
        catch
        {
            throw new ArgumentException("Null data.");
        }

        try
        {
            String.IsNullOrEmpty(password);
        }
        catch
        {
            throw new ArgumentException("Null password.");
        }

        using (SymmetricAlgorithm alg = GetAlgorithm(password))
        using (MemoryStream ms = new MemoryStream())
        using (CryptoStream cs = new CryptoStream(ms, alg.CreateDecryptor(), CryptoStreamMode.Write))
        {
            byte[] buffer = Convert.FromBase64String(data);//This is where the exception occurs
            cs.Write(buffer, 0, buffer.Length);
            cs.FlushFinalBlock();
            buffer = ms.ToArray();

            return Convert.ToBase64String(buffer);
        }
     }
4

1 に答える 1

2

このコードはまったく何もしません:

try
{
    String.IsNullOrEmpty(data);
}
catch
{
    throw new ArgumentException("Null data.");
}

これはString.IsNullOrEmpty()、例外をスローしないためです。を返しますbool。しかし、あなたはその戻り値で何もしていません。ステートメントが終了すると、返されたものはすべて破棄されます。

したがって、メソッドで後で使用しようとすると、例外が発生しますdatanull

byte[] buffer = Convert.FromBase64String(data);

他の方法では、すでにnull値が正しくチェックされています。では、同じアプローチを使用してみませんか?

if (String.IsNullOrEmpty(data))
    throw new ArgumentException("Null data.");

try/catch一般的な注意事項として、アプリケーション ロジックにはブロックを使用しないでください。これらは、例外をキャッチして処理するためのものです。条件が true かどうかを確認するだけの場合は、ifステートメントを使用します。さらに、catchキャッチしている実際の例外を無視するブロックは、よく知られた悪い考えです。意味のある例外情報が破棄され、エラーの診断がはるかに難しくなります。

于 2015-11-19T03:29:53.710 に答える