8.6 try语句 - 图1可以通过 MSDN 查方法相应的异常。
如 Int32.Parse 方法 (String) 就有以下异常。
图片.png

粗略的处理异常:

  1. static void Main(string[] args)
  2. {
  3. Calculator c = new Calculator();
  4. Console.WriteLine(c.Add("abc","100"));
  5. }
  6. }
  7. class Calculator
  8. {
  9. public int Add(string arg1,string arg2)
  10. {
  11. int a = 0;
  12. int b = 0;
  13. try
  14. {
  15. a = int.Parse(arg1);
  16. b = int.Parse(arg2);
  17. }
  18. catch
  19. {
  20. Console.WriteLine("Your argument(s) have error!");
  21. }
  22. int result = a + b;
  23. return result;
  24. }
  25. }

图片.png

精确的处理异常:

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. Calculator c = new Calculator();
  6. Console.WriteLine(c.Add(null,"100"));
  7. }
  8. }
  9. class Calculator
  10. {
  11. public int Add(string arg1,string arg2)
  12. {
  13. int a = 0;
  14. int b = 0;
  15. try
  16. {
  17. a = int.Parse(arg1);
  18. b = int.Parse(arg2);
  19. }
  20. catch(ArgumentNullException)
  21. {
  22. Console.WriteLine("Your argument(s) are null.");
  23. }
  24. catch(FormatException)
  25. {
  26. Console.WriteLine("Your argument(s) are not number.");
  27. }
  28. catch (OverflowException)
  29. {
  30. Console.WriteLine("Out of rangle!");
  31. }
  32. int result = a + b;
  33. return result;
  34. }
  35. }

图片.png

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. Calculator c = new Calculator();
  6. Console.WriteLine(c.Add("9999999999999999999999999999","100"));
  7. }
  8. }
  9. class Calculator
  10. {
  11. public int Add(string arg1,string arg2)
  12. {
  13. int a = 0;
  14. int b = 0;
  15. try
  16. {
  17. a = int.Parse(arg1);
  18. b = int.Parse(arg2);
  19. }
  20. catch(ArgumentNullException ane)
  21. {
  22. Console.WriteLine(ane.Message);
  23. }
  24. catch(FormatException fe)
  25. {
  26. Console.WriteLine(fe.Message);
  27. }
  28. catch (OverflowException oe)
  29. {
  30. Console.WriteLine(oe.Message);
  31. }
  32. int result = a + b;
  33. return result;
  34. }
  35. }

图片.png

finally

  • 应该把释放系统资源的语句写在 finally block 里面
  • 有时候也在 finally block 里面写 log

    1. class Program
    2. {
    3. static void Main(string[] args)
    4. {
    5. Calculator c = new Calculator();
    6. Console.WriteLine(c.Add("abc","100"));
    7. }
    8. }
    9. class Calculator
    10. {
    11. public int Add(string arg1,string arg2)
    12. {
    13. int a = 0;
    14. int b = 0;
    15. bool hasError = false;
    16. try
    17. {
    18. a = int.Parse(arg1);
    19. b = int.Parse(arg2);
    20. }
    21. catch(ArgumentNullException ane)
    22. {
    23. Console.WriteLine(ane.Message);
    24. hasError = true;
    25. }
    26. catch(FormatException fe)
    27. {
    28. Console.WriteLine(fe.Message);
    29. hasError = true;
    30. }
    31. catch (OverflowException oe)
    32. {
    33. Console.WriteLine(oe.Message);
    34. hasError = true;
    35. }
    36. finally
    37. {
    38. if (hasError)
    39. {
    40. Console.WriteLine("Execution has error!");
    41. }
    42. else
    43. {
    44. Console.WriteLine("Done!");
    45. }
    46. }
    47. int result = a + b;
    48. return result;
    49. }
    50. }

图片.png

throw

throw 将异常抛给调用者。
throw 关键字的语法比较灵活。

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. Calculator c = new Calculator();
  6. int r = 0;
  7. try
  8. {
  9. r = c.Add("999999999999999999999", "100");
  10. }
  11. catch (OverflowException oe)
  12. {
  13. Console.WriteLine(oe.Message);
  14. }
  15. }
  16. }
  17. class Calculator
  18. {
  19. public int Add(string arg1,string arg2)
  20. {
  21. int a = 0;
  22. int b = 0;
  23. try
  24. {
  25. a = int.Parse(arg1);
  26. b = int.Parse(arg2);
  27. }
  28. catch(ArgumentNullException ane)
  29. {
  30. Console.WriteLine(ane.Message);
  31. }
  32. catch(FormatException fe)
  33. {
  34. Console.WriteLine(fe.Message);
  35. }
  36. catch (OverflowException oe)
  37. {
  38. //Console.WriteLine(oe.Message);
  39. throw oe;
  40. }
  41. int result = a + b;
  42. return result;
  43. }
  44. }

图片.png