C# 正在解密方法/ConvertFromBase64String中引发ArgumentNullException

C# 正在解密方法/ConvertFromBase64String中引发ArgumentNullException,c#,encryption,argumentnullexception,C#,Encryption,Argumentnullexception,尽我最大的努力,我还无法修复解密方法引发的异常。在将数据转换为字节缓冲区数组的行上,抛出ArgumentNullException。首先,我添加了一个: if (String.IsNullOrEmpty(data)) { throw new ArgumentNullException ("Null data"); } 同样,对于密码,我也使用了相同的代码。然后,在if语句中出现相同的异常后,我将其更改为下面的try-catch语句。现在,异常不会在try-catch行中弹出,而是在De

尽我最大的努力,我还无法修复解密方法引发的异常。在将数据转换为字节缓冲区数组的行上,抛出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);
        }
     }

此代码完全不起任何作用:

try
{
    String.IsNullOrEmpty(data);
}
catch
{
    throw new ArgumentException("Null data.");
}
这是因为
String.IsNullOrEmpty()
不会引发异常。它返回一个
bool
。但是你不能用这个返回值做任何事情。当语句结束时,返回的内容将被丢弃

因此,如果
data
null
,那么当您稍后在方法中尝试使用它时,您将得到一个异常:

byte[] buffer = Convert.FromBase64String(data);
您的另一个方法已正确检查
null
值。那么为什么不使用同样的方法呢

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


一般来说,不要为应用程序逻辑使用
try/catch
块。这些用于捕获和处理异常。如果只需要检查条件是否为真,请使用
If
语句。此外,
catch
块忽略它们捕获的实际异常是一个众所周知的坏主意。它会丢弃有意义的异常信息,使错误更难诊断。

IsNullOrEmpty
返回true或false。为什么您希望它抛出异常?为什么您试图使用
try/catch
块来代替
if
语句?这两种结构做的事情非常不同。在解密中使用与加密相同的逻辑(使用if语句而不是Try…Catch。感谢大家的回复。使用if as Encrypt最终会在if语句本身的行上出现ArgumentNullException,我一直在尝试修复该异常。非常感谢您的回复!这里有非常好的内容要知道。我现在确实看到,使用Try-Catch不会是e关于检查空字符串的正确方法。但是在解密中使用的if检查与加密的方法相同,最后出现另一个“ArgumentNullException未经用户代码处理”在使用if检查本身的行上抛出时出错。@gecko94:这是因为该方法正在抛出一个异常。当您抛出一个异常时……那么……将抛出一个异常。处理该异常是使用代码的人的责任。@gecko94从“数据作为字符串”中删除“作为字符串”;它已经是一个字符串了。啊,好吧,我会努力的。再次感谢各位。在我从另一个来源读到“as string”后,它就出现了,说这可能会解决我遇到的问题。