我怎样才能传递异常

时间:2011-06-30 07:47:57

标签: c#

如何处理预期的异常?

我的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放入其中 尝试捕捉?

4 个答案:

答案 0 :(得分:7)

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

如果需要在该方法中执行某些操作(例如日志记录),则可以使用

捕获异常并在catch块中重新抛出
throw;

请注意,这比

更受欢迎
throw e;

因为后者将重写堆栈跟踪。在这种特殊情况下,它可能没什么区别,但值得注意。

我建议您暂时忽略加密,并在C#中寻找关于异常处理的好文章或书籍。 This MSDN page可能是一个很好的起点。

答案 1 :(得分:2)

假设您确实需要在此级别执行某些操作,只需重新抛出异常:

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

然而,根本不捕捉它可能更容易,并让它更高地冒泡到你的另一个异常处理程序。

答案 2 :(得分:2)

如果要继续解除异常,堆栈不会从catch块中return null。你需要throw(没有异常引用)继续展开相同的异常。

e.g。

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类)并使用派生版本。这使得捕获变得更容易,因为您可以捕获所需的确切类型,而不必让您的catch块找出做什么,因为您抛出了过多的异常。

答案 3 :(得分:1)

只有永远才会捕获异常,如果您可以使用它有用的东西。简单地吞下它在Decrypt方法中返回null是没有用的。相反,让异常冒泡,直到它达到可以有效处理的程度。

  

我是否必须尝试使用​​u.RowKey   赶上了?

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