如何处理预期的异常?
我的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放入其中 尝试捕捉?
答案 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 赶上了?
这是一个更适合捕捉异常的地方......