我怎么能放弃一个例外

本文关键字:一个 怎么能 放弃 | 更新日期: 2023-09-27 18:00:40

如何处理预期的异常?

我的MVC控制器中有调用以下内容的代码:

u.RowKey == new SimplerAES().Dec(HttpServerUtility.UrlTokenDecode(id)));

在我的另一个SimplerAES类中:

    public string Dec(byte[] encrypted)
    {
        return encoder.GetString(Decrypt(encrypted));
    }
    public byte[] Decrypt(byte[] buffer)
    {
        try {
            MemoryStream decryptStream = new MemoryStream();
            using (CryptoStream cs = new CryptoStream(decryptStream, decryptor, CryptoStreamMode.Write))
            {
                cs.Write(buffer, 0, buffer.Length);
            }
            return decryptStream.ToArray();
        } catch(CryptographicException e){
            //... do something with it ...
            return null; // I put the return null here as I got a syntax message saying
                         // not all code returns
        }
    }

有人能解释一下我是如何得到解密失败的消息的吗直到我第一次尝试获取RowKey。我必须把u.RowKey放在也尝试接球?

我怎么能放弃一个例外

只是不要在方法中捕获异常,除非真的需要"做某事"部分。如果你没有捕捉到异常,它会在堆栈中冒泡,直到捕捉到它的代码

如果do需要在该方法中执行某些操作,例如日志记录,则可以使用捕获异常并在捕获块中重新抛出

throw;

请注意,这比更可取

throw e;

因为后者将重写堆栈跟踪。在这种特殊情况下,这可能不会有太大的不同,但值得注意。

我建议您暂时忽略密码学,去寻找关于C#异常处理的好文章或书籍。这个MSDN页面可能是一个很好的起点。

假设您实际上需要在这个级别上做一些事情,只需重新抛出异常:

catch (CrypotgraphicException e)
{
    // Do something
    throw;
}

然而,可能更简单的做法是根本不捕捉它,让它向上冒泡到其他异常处理程序。

如果您想继续让异常展开,请不要从catch块中return null堆栈。您需要throw(没有异常引用)才能使用相同的异常继续展开。

例如

try
{
    // Do stuff
}
catch(CryptographicException e)
{
    // Do stuff to clean up
    throw;
}

如果您throw e(它有一个现有的异常对象),您会破坏一些堆栈跟踪数据,这会降低它的用处。如果要添加更多信息,请将现有异常包装在一个新的异常中(作为InnerException),然后抛出新的异常对象。这样可以保留完整的异常信息。

try
{
    // Do stuff
}
catch(CryptographicException e)
{
    // Do stuff to clean up
    Exception newEx = new Exception("Some further message", e);
    throw newEx;
}

注意:不要简单地创建基Exception对象,您应该从现有的基派生一个新的Exception类(如果没有合适的Exception类),并使用派生的版本。这使得捕获变得更容易,因为你可以捕获你需要的确切类型,而不必让你的捕获块知道该怎么做,因为你抛出了过于宽泛的异常。

只有才会在有有用的事情可以处理的情况下捕获异常。简单地在解密方法中吞下它并返回null是没有用的。相反,让异常冒泡,直到它达到可以有效处理的程度为止。。

我必须在一次尝试中输入u.RowKey吗也抓?

这将是一个更适合捕捉异常的地方。。。