黑马程序员技术交流社区
标题: 关于异常的问题 [打印本页]
作者: mdl 时间: 2013-6-18 13:03
标题: 关于异常的问题
如题,到底什么时候要在代码中用到try-catch语句呢?是自己感觉某段代码可能有错误的时候吗?还有那么多的异常类,又怎样知道该用哪个类呢?
作者: 许庭洲 时间: 2013-6-18 13:25
1.try-catch 块的用途是捕捉和处理工作代码所生成的异常。
2.有些异常可以在 catch 块中处理,解决问题后不会再次引发异常;
3.例如:
在此示例中,IndexOutOfRangeException 不是最适当的异常:对本方法而言 ArgumentOutOfRangeException 更恰当些,因为错误是由调用方传入的 index 参数导致的。
class TestTryCatch
{
static int GetInt(int[] array, int index)
{
try
{
return array[index];
}
catch (System.IndexOutOfRangeException e) // CS0168
{
System.Console.WriteLine(e.Message);
//set IndexOutOfRangeException to the new exception's InnerException
throw new System.ArgumentOutOfRangeException("index parameter is out of range.", e);
}
}
}
4.导致异常的代码被括在 try 块中。在其后面紧接着添加一个 catch 语句,以便在 IndexOutOfRangeException 发生时对其进行处理。catch 块处理 IndexOutOfRangeException,并引发更适当的 ArgumentOutOfRangeException 异常。为给调用方提供尽可能多的信息,应考虑将原始异常指定为新异常的 InnerException。因为 InnerException 属性是只读,所以必须在新异常的构造函数中为其赋值。
作者: 陈壹 时间: 2013-6-18 13:40
个人理解:try-catch用于处理可预知行异常而又难以免除,例如输入异常,数据类型转换等等
作者: changweihua 时间: 2013-6-18 13:45
运行时有一组从 SystemException 派生的基异常,它在执行各指令时引发这些异常。 下表按层次结构列出了运行时提供的标准异常以及派生类的创建条件。
异常类型 | 基类型 | 说明 | 示例 |
异常 | Object
| 所有异常的基类。 | 无(使用此异常的派生类)。 |
SystemException | 异常 | 所有运行时生成的错误的基类。 | 无(使用此异常的派生类)。 |
IndexOutOfRangeException | SystemException | 仅当错误地对数组进行索引时,才由运行时引发。 | 在数组的有效范围外对数组进行索引: arr[arr.Length+1] |
NullReferenceException | SystemException | 仅当引用 null 对象时,才由运行时引发。 | object o = null; o.ToString(); |
AccessViolationException | SystemException | 仅在访问无效内存时由运行时引发。 | 当与非托管代码或不安全的托管代码互操作时或者使用无效指针时发生。 |
InvalidOperationException | SystemException | 当处于无效状态时,由方法引发。 | 从基础集合移除 Item 后调用Enumerator.GetNext()。 |
ArgumentException | SystemException | 所有参数异常的基类。 | 无(使用此异常的派生类)。 |
ArgumentNullException | ArgumentException | 由不允许参数为 null 的方法引发。 | String s = null; "Calculate".IndexOf (s); |
ArgumentOutOfRangeException | ArgumentException | 由验证参数是否位于给定范围内的方法引发。 | String s = "string"; s.Chars[9]; |
ExternalException | SystemException | 在运行时的外部环境中发生或针对这类环境的异常的基类。 | 无(使用此异常的派生类)。 |
ComException | ExternalException | 封装 COM HRESULT 信息的异常。 | 在 COM 互操作中使用。 |
SEHException | ExternalException | 封装 Win32 结构化异常处理信息的异常。 | 在非托管代码 interop 中使用。 |
一般自定义的异常继承自ApplicationException而不是SystemException
作者: 成都—陈超 时间: 2013-6-18 14:26
try{}—catch{} 在可预判程序的一些可能会发生的错误异常时使用,catch捕捉try中抛出的异常,在catch{}中写对异常的一些处理,例如:
try
{
int number = Convert.ToInt32(Console.ReadLine());
if (number < min || number > max)
{
Console.WriteLine("只能输入{0}-{1}之间的数字,请重新输入!", min, max);
continue;
}
return number;
}
catch
{
Console.WriteLine("只能输入数字,请重新输入!");
}
异常类有很多,exception是所有异常的“老祖宗”,捕捉exception相当于捕捉可能发生的一切异常。
其他好多的异常类就靠自己积累了—— 像SystemException、FormatException……。。。
作者: .netNo1 时间: 2013-6-18 20:56
try中写可能出错的代码,catch抛出异常;catch (Exception ex)ex是异常类的变量 ,包含了当前发生在 捕捉到的try块的所有异常信息,
作者: 彭家贰小姐 时间: 2013-6-24 16:06
两个例子:
1.课堂上讲的简单的例子
Console.ReadLine() 转整数的时候 用到- try
- {
- var num = Convert.ToInt32(Console.ReadLine()); //接受用户输入的文本
- ...
- }
- catch (Exception) //异常处理
- {
- Console.WriteLine("格式错误...");
- }
复制代码 2.数据库链接测试的时候
如果Open不出来就会转入catch 中
但finally是不管报错还是不报错 都会走的方法...- /// <summary>
- /// 数据库链接测试
- /// </summary>
- /// <param name="conStr">ConnectionString</param>
- /// <returns></returns>
- public static bool IsConnection(string conStr)
- {
- var conn = new SqlConnection { ConnectionString = conStr };
- var isConn = true;
- try
- {
- conn.Open();
- }
- catch (Exception)
- {
- isConn = false;
- }
- finally
- {
- conn.Close();
- }
- if (conn.State == ConnectionState.Closed || conn.State == ConnectionState.Broken)
- {
- return isConn;
- }
- return isConn;
- }
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |