A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© mdl 中级黑马   /  2013-6-18 13:03  /  1901 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

如题,到底什么时候要在代码中用到try-catch语句呢?是自己感觉某段代码可能有错误的时候吗?还有那么多的异常类,又怎样知道该用哪个类呢?

6 个回复

倒序浏览
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 属性是只读,所以必须在新异常的构造函数中为其赋值。
回复 使用道具 举报
个人理解:try-catch用于处理可预知行异常而又难以免除,例如输入异常,数据类型转换等等
回复 使用道具 举报
运行时有一组从 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

回复 使用道具 举报
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……。。。
回复 使用道具 举报
try中写可能出错的代码,catch抛出异常;catch (Exception ex)ex是异常类的变量 ,包含了当前发生在 捕捉到的try块的所有异常信息,
回复 使用道具 举报
两个例子:
1.课堂上讲的简单的例子
Console.ReadLine() 转整数的时候 用到
  1. try
  2. {
  3. var num = Convert.ToInt32(Console.ReadLine()); //接受用户输入的文本
  4. ...
  5. }
  6. catch (Exception) //异常处理
  7. {
  8. Console.WriteLine("格式错误...");
  9. }
复制代码
2.数据库链接测试的时候
如果Open不出来就会转入catch 中
但finally是不管报错还是不报错 都会走的方法...
  1. /// <summary>
  2. /// 数据库链接测试
  3. /// </summary>
  4. /// <param name="conStr">ConnectionString</param>
  5. /// <returns></returns>
  6. public static bool IsConnection(string conStr)
  7. {
  8. var conn = new SqlConnection { ConnectionString = conStr };
  9. var isConn = true;
  10. try
  11. {
  12. conn.Open();
  13. }
  14. catch (Exception)
  15. {
  16. isConn = false;
  17. }
  18. finally
  19. {
  20. conn.Close();
  21. }
  22. if (conn.State == ConnectionState.Closed || conn.State == ConnectionState.Broken)
  23. {
  24. return isConn;
  25. }
  26. return isConn;
  27. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马