关于异常,记录一些看到的和自己总结的
for (int i = 0; i <= 2; i++)
{
try
{
int number = Convert.ToInt32("aa");
}
catch (Exception ex)
{
throw new MyUserException(ex.Message);
}
}
MyUserException是自定义的异常类,把异常信息记入到异常文本error.txt
public class MyUserException : Exception
{
private string messageinfo = string.Empty;
public MyUserException(string message)
: base(message)
{
messageinfo = message;
OperateException(message);
}
private void OperateException(string message)
{
string path = Directory.GetCurrentDirectory() + @"\error.txt";
if (File.Exists(path))
{
FileStream nFile = new FileStream(path, FileMode.Open);
StreamWriter sw = new StreamWriter(nFile);
sw.WriteLine(message);
sw.Close();
}
}
}
这是一个很常见的异常捕捉,但是如此的抛出异常并同时写入异常文本后,程序会终止。我们也可以在catch中不用抛出异常,也可写一个异常操作类,专门写入异常信息,可让程序继续进行,但是我经常看到大家在问一个问题就是:如何让存在异常后,让程序继续进行。
我看到很多人的回答是catch中不写任何代码,这样回答其实是不负责任的,很多情况下,比如下列代码
try
{
for (int i = 0; i <= 2; i++)
{
int number = Convert.ToInt32("aa");
}
}catch ()
{
}
String name=”xxx”;
这里我把异常捕捉写在循环外面,如果只是简单的catch中不写任何代码就让程序继续执行循环体,显然这里是做不到的,程序会继续往下执行String name=”xxx”;而不会去执行循环体,所以我们可以考虑把异常捕捉写到循环体内,catch中什么都不写,或者写continue让循环继续
for (int i = 0; i <= 2; i++)
{
try
{
int number = Convert.ToInt32("aa");
}
catch ()
{
}
}
其实异常捕捉有人说太多try会影响性能,但是实际上,有try和没有try性能差不多,只是在偶尔出现异常后,执行到catch时会消耗很多时间,但是事实上异常并不时时发生,用这点时间换取捕捉到的异常还是值得的,只要你不要把异常捕捉作为程序的逻辑设计,但是不可以否认的是有try catch在编译时是需要耗一些时间的,因为编译模式内要回填异常的处理地址。
.net在产生异常时是逐步向外层查找处理程序的,因此可以说捕获的越早效率越高.如果当前应用程序没有对异常进行处理,就交给runtime,在这种情况下,效率才是最低的,而且比较难于处理。
我曾经看过一篇文章,讲述的是抛出异常时,是catch内部抛出实例化异常类效率高,还是在catch调用静态方法,然后在静态方法中抛出异常效率高,例如
private int GetItOne(int key) {
int value;
if (!_dict.TryGetValue(key,out value)) {
throw new ArgumentOutOfRangeException("key");
}
return value;
}
和
private int GetItTwo(int key) {
int value;
if (!_dict.TryGetValue(key, out value)) {
ThrowArgumentOutOfRangeException();
}
return value;
}
private static void ThrowArgumentOutOfRangeException() {
throw new ArgumentOutOfRangeException("key");
}
所以说如果自定义一个静态的异常类,然后throw还是有优势的。
参见
http://www.cnblogs.com/tansm/archive/2012/05/13/dotnet_profile1.html#commentform