源代码
如下:
//-----------------------------------------------
// CsDateProperties.cs
//-----------------------------------------------
using ystem;
class CsDateProperties
{
public static void Main()
{
Date mydate = newDate();
try
{
mydate.Month = 8;
mydate.Day = 29;
mydate.Year = 2001;
Console.WriteLine("Day of year = {0}", mydate.DayOfYear);
}
catch (Exceptionexc)
{
Console.WriteLine(exc);
}
}
}
class Date
{
// Fields字段
int year;
int month;
int day;
static int[] MonthDays = new int[]{ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
// Properties属性
public int Year
{
set
{
if (value < 1600)
thrownewArgumentOutOfRangeException("Year");
else
year = value;
}
get
{
return year;
}
}
public int Month
{
set
{
if (value < 1 || value > 12)
thrownewArgumentOutOfRangeException("Month");
else
month = value;
}
get
{
return month;
}
}
public int Day
{
set
{
if (value < 1 || value > 31)
thrownewArgumentOutOfRangeException("Day");
else
day = value;
}
get
{
return day;
}
}
public int DayOfYear
{
get
{
return MonthDays[month - 1] + day +(month > 2&& IsLeapYear(year) ? 1 : 0);
}
}
// Method方法
public static bool IsLeapYear(int year)
{
return (year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0));
}
}
//其中代码中使用
//Date mydate = newDate();来构造Date对象。
第二篇
try{
??......你的代码
}catch(异常类 对象){...出异常了! 怎么办啊? 在这里处理一下吧!}
//例如SqlException、AugumentException等,你初学可以直接写Exception
try{
??......你的代码
}catch(Exception ex)
{
?MessageBox.Show(ex.Message);//显示异常信息
}
另有一种写法,效果与上面的代码功能一样,但是不能捕获异常信息
try{
??......你的代码
}catch
{
??//do nothing or...
}
当try{}中任何代码出现异常的时候,都会跳到catch(…){}或catch{}中
最好的办法是预料异常,并在编码时用if…esle来编写处理可能出现的任何其他情况,那样效率是比较好的(不要弄一大堆else)…如果你确定你的代码不可能出现任何异常,那么你就不要写try…catch 它是很消耗程序性能的!
第三篇
try
catch
finally
1、将预见可能引发异常的代码包含在try语句块中。
2、如果发生了异常,则转入catch的执行。catch有几种写法:
catch
这将捕获任何发生的异常。
catch(Exception e)
这将捕获任何发生的异常。另外,还提供e参数,你可以在处理异常时使用e参数来获得有关异常的信息。
catch(Exception的派生类 e)
这将捕获派生类定义的异常,例如,我想捕获一个无效操作的异常,可以如下写:
catch(InvalidOperationException e)
{
…
}
这样,如果try语句块中抛出的异常是InvalidOperationException,将转入该处执行,其他异常不处理。
catch可以有多个,也可以没有,每个catch可以处理一个特定的异常。.net按照你catch的顺序查找异常处理块,如果找到,则进行处理,如果找不到,则向上一层次抛出。如果没有上一层次,则向用户抛出,此时,如果你在调试,程序将中断运行,如果是部署的程序,将会中止。
如果没有catch块,异常总是向上层(如果有)抛出,或者中断程序运行。
3、finally
finally可以没有,也可以只有一个。无论有没有发生异常,它总会在这个异常处理结构的最后运行。即使你在try块内用return返回了,在返回前,finally总是要执行,这以便让你有机会能够在异常处理最后做一些清理工作。如关闭数据库连接等等。
注意:如果没有catch语句块,那么finally块就是必须的。
如果你不希望在这里处理异常,而当异常发生时提交到上层处理,但在这个地方无论发生异常,都要必须要执行一些操作,就可以使用try finally,
很典型的应用就是进行数据库操作:
用下面这个原语来说明:
try
{
DataConnection.Open();
DataCommand.ExecuteReader();
…
return;
}
finally
{
DataConnection.Close();
}
无论是否抛出异常,也无论从什么地方return返回,finally语句块总是会执行,这样你有机会调用Close来关闭数据库连接(即使未打开或打开失败,关闭操作永远是可以执行的),以便于释放已经产生的连接,释放资源。
顺便说明,**return是可以放在try语句块中的。**但不管在什么时机返回,在返回前,finally将会执行。
小结
try { //执行的代码,其中可能有异常。一旦发现异常,则立即跳到catch执行。否则不会执行catch里面的内容 }
catch { //除非try里面执行代码发生了异常,否则这里的代码不会执行 }
finally { //不管什么情况都会执行,包括try catch 里面用了return ,可以理解为只要执行了try或者catch,就一定会执行 finally }
常见异常和自定义异常
C#异常类一、基类Exception
C#异常类二、常见的异常类
1、SystemException类:该类是System命名空间中所有其他异常类的基类。(建议:公共语言运行时引发的异常通常用此类)
2、ApplicationException类:该类表示应用程序发生非致命错误时所引发的异常(建议:应用程序自身引发的异常通常用此类)
C#异常类三、与参数有关的异常类
此类异常类均派生于SystemException,用于处理给方法成员传递的参数时发生异常
1、ArgumentException类:该类用于处理参数无效的异常,除了继承来的属性名,此类还提供了string类型的属性ParamName表示引发异常的参数名称。
2、FormatException类:该类用于处理参数格式错误的异常。
C#异常类四、与成员访问有关的异常
1、MemberAccessException类:该类用于处理访问类的成员失败时所引发的异常。失败的原因可能的原因是没有足够的访问权限,也可能是要访问的成员根本不存在(类与类之间调用时常用)
2、MemberAccessException类的直接派生类:
i、FileAccessException类:该类用于处理访问字段成员失败所引发的异常
ii、MethodAccessException类:该类用于处理访问方法成员失败所引发的异常
iii、MissingMemberException类:该类用于处理成员不存在时所引发的异常
C#异常类五、与数组有关的异常
以下三个类均继承于SystemException类
1、IndexOutOfException类:该类用于处理下标超出了数组长度所引发的异常
2、ArrayTypeMismatchException类:该类用于处理在数组中存储数据类型不正确的元素所引发的异常
3、RankException类:该类用于处理维数错误所引发的异常
C#异常类六、与IO有关的异常
1、IOException类:该类用于处理进行文件输入输出操作时所引发的异常。
2、IOException类的5个直接派生类:
i、DirectionNotFoundException类:该类用于处理没有找到指定的目录而引发的异常。
ii、FileNotFoundException类:该类用于处理没有找到文件而引发的异常。
iii、EndOfStreamException类:该类用于处理已经到达流的末尾而还要继续读数据而引发的异常。
iv、FileLoadException类:该类用于处理无法加载文件而引发的异常。
v、PathTooLongException类:该类用于处理由于文件名太长而引发的异常。
C#异常类七、与算术有关的异常
1、ArithmeticException类:该类用于处理与算术有关的异常。
2、ArithmeticException类的派生类:
i、DivideByZeroException类:表示整数货十进制运算中试图除以零而引发的异常。
ii、NotFiniteNumberException类:表示浮点数运算中出现无穷打或者非负值时所引发的异常。
在
.NET框架
中的异常类都派生自System.Exception 类。这个类的大部分常用成员如下:
HelpLink是一个链接到帮助文件的链接,该帮助文件提供异常的相关信息。
Message是指明一个错误细节的文本。
Source导致异常的对象或应用的名称。
StackTrace是堆栈中调用的方法列表。
TargetSite是抛出异常的方法名称。
Try/Catch/Finally 块
C#中使用Try/Catch/Finally块处理一个异常。
Try语句指明在执行过程中需要监视抛出异常的代码块。
Catch语句指明了在执行了Try代码块后应该执行的代码块。这个代码块无论异常是否发生都会执行。实际上,它常用于可能要求的清理代码。
C#的自定义异常
对于用户的输入判断是否符合标准,不符合标准的,抛出异常!
1、字符串的长度,在某个区间
2、int,float,double等的大小区间
3、某些字符串里不能包含特殊字符
4、email、datetime等需要有特殊格式限制
其他的再补充…
处理异常的最佳做法
http://msdn.microsoft.com/zh-cn/library/seyhszts.aspx
ArgumentException 类:在向方法提供的其中一个参数无效时引发的异常
http://msdn.microsoft.com/zh-cn/library/system.argumentexception.aspx
创建自定义异常主要可以两个类中派生而来:
1.ApplicationException 类
2.System.Exception类
二者的区别是什么?
如何利用C#的自定义异常,这是个要解决的问题!
创建自定义异常应该从ApplicationException 类派生而来.应该有一个Exception结尾的类名,应该定义3个构造函数:一个默认构造函数,一个接收字符串(错误消息)构造函数,还有一个接收字符 串参数和异常参数(错误消息和内部异常对象)的构造函数.
例子:
class TestException : ApplicationException
{
public TestException() : base(“exception message”)
{}
public TestException(string message) : base(message)
{
}
public TestException(string message,Exception inner) : base (message,inner)
{}
}
其他文档资源链接:
http://blog.csdn.net/yubo35033720/archive/2007/05/22/1620146.aspx
http://blog.csdn.net/jbgh608/archive/2007/09/24/1798657.aspx
http://www.tzwhx.com/newOperate/html/1/11/113/6252.html
http://topic.csdn.net/t/20051118/16/4403097.html
https://blog.csdn.net/llll29550242/article/details/6335020
第四篇
异常的最佳做法
设计良好的应用处理异常和错误以防止应用崩溃。 本部分介绍了处理和创建异常的最佳做法。
使用 try/catch/finally 块从错误中恢复或释放资源
对可能生成异常的代码使用 try/catch 块,代码就可以从该异常中恢复。 在 catch 块中,始终按从派生程度最高到派生程度最低的顺序对异常排序。 所有异常都派生自 Exception。 位于处理基本异常类的 catch 子句之后的 catch 子句不处理派生程度较高的异常。 当代码无法从异常中恢复时,请勿捕获该异常。 如有可能,请启用调用堆栈中更上层的方法来进行恢复。
使用 using 语句或 finally 块清除分配的资源。 当引发了异常时,优先使用 using 语句自动清除资源。 使用 finally 块清除未实现 IDisposable 的资源。 即使引发了异常,通常也会执行 finally 子句中的代码。
在不引发异常的前提下,处理常见情况
对于易于发生但可能会触发异常的情况,请考虑使用能避免引发异常的方法进行处理。 例如,如果尝试关闭已关闭的连接,则会获得 InvalidOperationException。 尝试关闭前,可通过使用 if 语句检查连接状态,避免该情况。
if (conn.State != ConnectionState.Closed)
{
conn.Close();
}
如果关闭前未检查连接状态,则可能捕获 InvalidOperationException 异常。
try
{
conn.Close();
}
catch (InvalidOperationException ex)
{
Console.WriteLine(ex.GetType().FullName);
Console.WriteLine(ex.Message);
}
选择的方法取决于希望事件发生的频率。
如果此事件未经常发生(也就是说,如果此事件确实为异常并指示错误(如意外的文件尾)),则使用异常处理。 如果使用异常处理,将在正常条件下执行较少代码。
如果事件例行发生,且被视为正常性执行的一部分,请检查代码中是否存在错误情况。 检查常见错误情况时,为了避免异常,执行较少的代码。
设计类,以避免异常
类可提供一些方法或属性来确保避免生成会引发异常的调用。 例如,FileStream 类提供可帮助确实是否已到达文件末尾的方法。 它可用于避免在读取超过文件末尾时引发的异常。 下方示例显示如何读取文件末尾而不会引发异常。
class FileRead
{
public void ReadAll(FileStream fileToRead)
{
// This if statement is optional
// as it is very unlikely that
// the stream would ever be null.
if (fileToRead == null)
{
throw new ArgumentNullException();
}
int b;
// Set the stream position to the beginning of the file.
fileToRead.Seek(0, SeekOrigin.Begin);
// Read each byte to the end of the file.
for (int i = 0; i < fileToRead.Length; i++)
{
b = fileToRead.ReadByte();
Console.Write(b.ToString());
// Or do something else with the byte.
}
}
}
避免异常的另一方法是,对极为常见的错误案例返回 NULL(或默认值),而不是引发异常。 极其常见的错误案例可被视为常规控制流。 通过在这些情况下返回 NULL(或默认值),可最大程度地减小对应用的性能产生的影响。
对于值类型,是否使用 Nullable 或默认值作为错误指示符是特定应用需要考虑的内容。 通过使用 Nullable,default 变为 null 而非 Guid.Empty。 有时,添加 Nullable 可更加明确值何时存在或不存在。 在其他时候,添加 Nullable 可以创建额外的案例以查看不必要的内容,并且仅用于创建潜在的错误源。
引发异常而不是返回错误代码
异常可确保故障不被忽略,因为调用代码不会检查返回代码。
使用预定义的 .NET 异常类型
仅当预定义的异常类不适用时,引入新异常类。 例如:
如果根据对象的当前状态,属性集或方法调用不适当,则会引发 InvalidOperationException 异常。
如果传送了无效的参数,则引发 ArgumentException 异常或从 ArgumentException 派生的一个预定义类。
异常类名称的结尾为 Exception
需要自定义异常时,对其正确命名并从 Exception 类进行派生。 例如:
public class MyFileNotFoundException : Exception
{
}
在自定义异常类中包括三种构造函数
创建自己的异常类时,请至少使用三种公共构造函数:无参数构造函数、采用字符串消息的构造函数以及采用字符串消息和内部异常的构造函数。
Exception()(使用默认值)。
Exception(String),它接受字符串消息。
Exception(String, Exception),它接受字符串消息和内部异常。
有关示例,请参见 如何:创建用户定义的异常。
确保代码远程执行时异常数据可用
创建用户定义的异常时,请确保异常的元数据对远程执行的代码可用。
例如,在支持应用域的 .NET 实现中,异常可能会跨应用域抛出。 假设应用域 A 创建应用域 B,后者执行引发异常的代码。 应用域 A 若想正确捕获和处理异常,它必须能够找到包含应用域 B 所引发的异常的程序集。如果应用域 B 在其应用程序基下(但未在应用域 A 的应用程序基下)引发了一个包含在程序集内的异常,那么应用域 A 将无法找到异常,且公共语言运行时将引发 FileNotFoundException 异常。 为避免此情况,可以两种方式部署包含异常信息的程序集:
将程序集放在两个应用域共享的公共应用程序基中。
- 或 -
如果两个应用域不共享一个公共应用程序基,则用强名称为包含异常信息的程序集签名并将其部署到全局程序集缓存中。
使用语法正确的错误消息
编写清晰的句子,包括结束标点。 分配给 Exception.Message 属性的字符串中的每个句子应以句点结尾。 例如,“日志表已溢出”。 是一个正确的消息字符串。
在每个异常中都包含一个本地化字符串消息
用户看到的错误消息派生自引发的异常的 Exception.Message 属性,而不是派生自异常类的名称。 通常将值赋给 Exception.Message 属性,方法是将消息字符串传递到异常构造函数的 message 参数。
对于本地化应用程序,应为应用程序可能引发的每个异常提供本地化消息字符串。 资源文件用于提供本地化错误消息。 有关本地化应用程序和检索本地化字符串的信息,请参阅以下文章:
如何:使用本地化的异常消息创建用户定义的异常
桌面应用中的资源
System.Resources.ResourceManager
在自定义异常中,按需提供其他属性
仅当存在附加信息有用的编程方案时,才在异常中提供附加属性(不包括自定义消息字符串)。 例如,FileNotFoundException 提供 FileName 属性。
放置引发语句,使得堆栈跟踪有所帮助
堆栈跟踪从引发异常的语句开始,到捕获异常的 catch 语句结束。
使用异常生成器方法
类从其实现中的不同位置引发同一异常是常见的情况。 为避免过多的代码,应使用帮助器方法创建异常并将其返回。 例如:
class FileReader
{
private string fileName;
public FileReader(string path)
{
fileName = path;
}
public byte[] Read(int bytes)
{
byte[] results = FileUtils.ReadFromFile(fileName, bytes);
if (results == null)
{
throw NewFileIOException();
}
return results;
}
FileReaderException NewFileIOException()
{
string description = “My NewFileIOException Description”;
return new FileReaderException(description);
}
}
在某些情况下,更适合使用异常的构造函数生成异常。 例如,ArgumentException 等全局异常类。
因发生异常而未完成方法时还原状态
当异常从方法引发时,调用方应能够假定没有副作用。 例如,如果你的代码可以通过从一个帐户取钱并存入另一个帐户来转移资金,而在存款时引发了异常,你不希望取款仍然有效。
public void TransferFunds(Account from, Account to, decimal amount)
{
from.Withdrawal(amount);
// If the deposit fails, the withdrawal shouldn’t remain in effect.
to.Deposit(amount);
}
上面的方法不会直接引发任何异常,但必须以防御方式进行编写,以便在存款操作失败时撤销取款。
解决这一情况的一种方法是,捕获由存款交易引发的异常,然后回滚取款。
private static void TransferFunds(Account from, Account to, decimal amount)
{
string withdrawalTrxID = from.Withdrawal(amount);
try
{
to.Deposit(amount);
}
catch
{
from.RollbackTransaction(withdrawalTrxID);
throw;
}
}
此示例介绍如何使用 throw 重新引发原始异常,让调用方更轻松地发现问题的真正原因,而无需检查 InnerException 属性。 另一种方法是,引发一个新的异常并将原始异常包括在其中作为内部异常:
catch (Exception ex)
{
from.RollbackTransaction(withdrawalTrxID);
throw new TransferFundsException(“Withdrawal failed.”, innerException: ex)
{
From = from,
To = to,
Amount = amount
};
}