Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 15 kết quả

Đề tài: try-catch trong C# có ý nghĩa gì?

  1. #1
    Ngày gia nhập
    02 2008
    Bài viết
    7

    Mặc định try-catch trong C# có ý nghĩa gì?

    hi, em mới bắt đầu chập chững làm quen với C#. Em có đoạn code sau đây hơi khó hiểu:

    Code:
    public void example(int n)
     float x;
     
     try
     {
       x=1/(float)n;
       Console.WriteLine(n);
     }
     catch(DivideByZeroException dbze) {
      Console.WriteLine(dbze.Message);
     }
     
     Console.WriteLine(n);
     Console.ReadLine();
     }
    Các anh chị đi trước cho em hỏi: câu lệnh Console.WriteLine(n) đầu tiên thì thực hiện được, còn câu lệnh Console.WriteLine(n) phía dưới lại ko thực hiện được. Vậy là vì sao ạ?
    cho mã vào trong thẻ nhé !
    Đã được chỉnh sửa lần cuối bởi Skynet : 02-04-2010 lúc 11:51 PM.

  2. #2
    Ngày gia nhập
    03 2010
    Bài viết
    17

    Try catch trong C# hay bất kỳ ngôn ngữ lập trình gì dùng để xử lý ngoại lệ.Thường thường lúc lập trình có những ngoại lệ mà mình ít để ý tới.
    1 số ví dụ về ngoại lệ:
    + khi chia 2 số nhưng mẫu số lại bằng 0
    + đọc ghi file nhưng file chưa được tạo hay có sẵn
    + chưa điền dữ liệu vào text box nhưng vẫn đưa ra xử lý
    ...
    Trong những trường hợp này chương trình yêu cầu đưa ra try catch để xử lý.Nếu như không có ngoại lệ thì sẽ chạy đoạn chương trình có trong try{ body } và bỏ qua đoạn catch{ }.Nếu tồn tại ngoại lệ thì chương trình chạy phần catch{} chứ không chạy phần try {}

    Ví dụ trong đoạn chương trình của bạn:

    Nếu bạn gọi hàm example(0) thì sẽ in ra (dbze.Message) //mesage này do C# định nghĩa sẵn.
    Hoặc bạn có thể tự định nghĩa message bằng Console.WriteLine("Loi khi chia cho 0") chẳng hạn.
    Nếu bạn gọi hàm example(a) với a#0 thì chương trình in ra n.

  3. #3
    Ngày gia nhập
    02 2008
    Bài viết
    7

    @ tra`da': em đã gọi example(5) với đoạn code trên. Câu lệnh Console.WriteLine(n) bên trong khối try thì in ra 0.2, còn câu lệnh Console.WriteLine(n) bên ngoài thì báo lỗi. Bác đã thử chưa ạ? Em ko hiểu sao khi ra bên ngoài thì n lại bị báo lỗi là chưa xác định nhỉ?

  4. #4
    Ngày gia nhập
    01 2010
    Bài viết
    41

    try catch được dùng để bẫy lỗi(debug) 1 chương trình, dùng để xử lý các tình huống có lỗi(còn gọi là ngoại lệ-exception), trình biên dịch sẽ dịch các code trong khối try{} trước nếu dịch tới đoạn code nào bị lỗi thì nó sẽ bỏ qua khối try{} và xuống khối catch{} để thực hiện. Phần phụ thêm trong khối catch{} như là catch{DivideByZeroException}, thì DivideByZeroException để chỉ rõ ra là khi gặp lỗi "chia cho 0" nó sẽ thực hiện code trong khối catch{DivideByZeroException}.

    còn về phần code bạn đưa mình compile vẫn tốt * *; đều ra được 2 cái. Chắc số hên

    @ltb: bạn in ra được 0.2 là super man rồi =)), vì trong khối try{} nó Console.WriteLine(n) chứ phải x đâu mà ra 0.2 , với lại chỉ có type int khi chia cho 0 mới báo lỗi, còn type float thì nó sẽ ra kết quà "infinity"; muốn nó báo lỗi khi chia cho 0 thì bạn nên để type của x và n là int.
    Đã được chỉnh sửa lần cuối bởi Malib : 02-04-2010 lúc 09:42 PM.

  5. #5
    Ngày gia nhập
    02 2008
    Bài viết
    7

    @Malib:
    bạn in ra được 0.2 là super man rồi =)), vì trong khối try{} nó Console.WriteLine(n) chứ phải x đâu mà ra 0.2
    hic, em post nhầm.
    với lại chỉ có type int khi chia cho 0 mới báo lỗi, còn type float thì nó sẽ ra kết quà "infinity"; muốn nó báo lỗi khi chia cho 0 thì bạn nên để type của x và n là int
    cám ơn bác nhìu, chỗ này em đã sửa lại kiểu int.
    Tình hình là vấn đề của em vẫn vòng quanh như con gà lanh chanh:
    Nếu em để thế này:
    Code:
    class Program
        {
            static void Main(string[] args)
            {
                example(5);
            }
    
    
            public static void example(int n)
            {
                int x;
    
                try
                {
                x=1/n;
                Console.WriteLine(x);
                }
                catch(DivideByZeroException dbze) {
                Console.WriteLine(dbze.Message);
                }
    
                //Console.WriteLine(x);
                Console.ReadLine();
            }
        }
    thì in ra kết quả là 0. 
    Nhưng nếu em để thế này:
    class Program
        {
            static void Main(string[] args)
            {
                example(5);
            }
    
    
            public static void example(int n)
            {
                int x;
    
                try
                {
                x=1/n;
                //Console.WriteLine(x);
                }
                catch(DivideByZeroException dbze) {
                Console.WriteLine(dbze.Message);
                }
    
                Console.WriteLine(x);
                Console.ReadLine();
            }
        }
    thì khi chạy chương trình, nó hiện lên hộp thoại: There were build errors. Would you like to continue and run the last successful build? (Yes/No).
    Thông báo lỗi đưa ra là: Use of unassigned local variable 'x'
    hic, em điên đầu lắm, chạy lần nào cũng thế cả, giúp em với các bác ơi
    Đã được chỉnh sửa lần cuối bởi Skynet : 02-04-2010 lúc 11:52 PM.

  6. #6
    Ngày gia nhập
    04 2010
    Nơi ở
    Đà Lạt, Lâm Đồng
    Bài viết
    257

    Mặc định try-catch trong C# có ý nghĩa gì?

    Trích dẫn Nguyên bản được gửi bởi ltb Xem bài viết
    @Malib:

    hic, em post nhầm.

    cám ơn bác nhìu, chỗ này em đã sửa lại kiểu int.
    Tình hình là vấn đề của em vẫn vòng quanh như con gà lanh chanh:
    Nếu em để thế này:
    class Program
    {
    static void Main(string[] args)
    {
    example(5);
    }


    public static void example(int n)
    {
    int x;

    try
    {
    x=1/n;
    Console.WriteLine(x);
    }
    catch(DivideByZeroException dbze) {
    Console.WriteLine(dbze.Message);
    }

    //Console.WriteLine(x);
    Console.ReadLine();
    }
    }
    thì in ra kết quả là 0.
    Nhưng nếu em để thế này:
    class Program
    {
    static void Main(string[] args)
    {
    example(5);
    }


    public static void example(int n)
    {
    int x;

    try
    {
    x=1/n;
    //Console.WriteLine(x);
    }
    catch(DivideByZeroException dbze) {
    Console.WriteLine(dbze.Message);
    }

    Console.WriteLine(x);

    Console.ReadLine();
    }
    }
    thì khi chạy chương trình, nó hiện lên hộp thoại: There were build errors. Would you like to continue and run the last successful build? (Yes/No).
    Thông báo lỗi đưa ra là: Use of unassigned local variable 'x'
    hic, em điên đầu lắm, chạy lần nào cũng thế cả, giúp em với các bác ơi
    tình hình là thế này nhé: lỗi ủa bạn là giá trị biến x không xác định khi bạn thực hiện lệnh Console.WriteLine(x) trong đoạn in đậm. Vì try chỉ là 1 khối trong cả khối try - catch nên nếu tính không được giá trị x trong câu lệnh x = 1/n thì lệnh trong catch sẽ thực hiện, mà lệnh trong catch lại ko có gán giá trị cho x.
    bạn thử sửa lại như sau:

    Cách 1 :
    khai báo int x = 0 thay cho int x;
    cách 2 , sửa lại khối catch như vầy :
    catch(DivideByZeroException dbze) {
    Console.WriteLine(dbze.Message);
    x = 0 ;
    }

    lưu ý, mình lấy giá trị 0 làm ví dụ
    Hoa Tử Đinh Hương Phụng Vũ Phi Y

  7. #7
    Ngày gia nhập
    02 2008
    Bài viết
    7

    @yscytd:
    em nhất trí lỗi đó là giá trị x chưa được xác định, nhưng vì sao thì em vẫn chưa rõ lắm.

    Code:
    Cách 1 :
    khai báo int x = 0 thay cho int x;
    cách 2 , sửa lại khối catch như vầy :
    catch(DivideByZeroException dbze) {
    Console.WriteLine(dbze.Message);
    x = 0 ;
    }
    2 cách của bác đều ok, vậy nên có thể hiểu như bác nói:
    Code:
    nếu tính không được giá trị x trong câu lệnh x = 1/n thì lệnh trong catch sẽ thực hiện
    Theo em hiểu lý thuyết, nếu ngoại lệ phát sinh trong khối try, thì các lệnh trong khối catch mới được thực thi. Nhưng trường hợp này em để n = 5, nghĩa là ko phát sinh ngoại lệ, và do đó lệnh trong khối try được thực thi. Vậy sao bên trong khối try thì in được giá trị của x, còn ra bên ngoài khối try lại ko in được?
    Bác giải thích rõ hơn cho em hiểu nhé, em mới làm quen với C# nên nhiều cái còn mơ hồ lắm.

  8. #8
    Ngày gia nhập
    02 2008
    Bài viết
    7

    @Skynet: em sorry nhé, lần sau em sẽ cẩn thận cho code vào thẻ

  9. #9
    Ngày gia nhập
    04 2010
    Bài viết
    21

    cái này có ji đâu mà khó hiểu. Nó chính là bẫy lỗi thôi mà

  10. #10
    Ngày gia nhập
    02 2008
    Bài viết
    7

    @stty: bác stty giải thích chi tiết hơn được ko, em chưa hiểu ý bác mún nói

Các đề tài tương tự

  1. try - throw - catch trong C++ có tác dụng gì?
    Gửi bởi hirikarate trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 9
    Bài viết cuối: 26-11-2011, 11:03 PM
  2. Sử dụng try {} catch{} để làm gì trong lập trình?
    Gửi bởi ChuotNhat3k trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 21
    Bài viết cuối: 16-03-2011, 08:20 AM
  3. Sử dụng try{} catch{} trong lập trình C++?
    Gửi bởi shesap trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 4
    Bài viết cuối: 07-01-2011, 04:05 PM
  4. kết nối C# với sql. Try catch có ý nghĩa gì?
    Gửi bởi hoan_it_cgh trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 11
    Bài viết cuối: 12-10-2010, 08:41 AM
  5. gặp rắc rối với return trong try catch
    Gửi bởi khacnam trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 13
    Bài viết cuối: 23-11-2007, 04:45 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn