2010-03-12 26 views
13

Bạn có thể giải thích cho tôi sự khác biệt giữa lỗi và ngoại lệ không?Sự khác biệt giữa lỗi và ngoại lệ trong .NET là gì?

+3

+1 Câu hỏi thú vị, tôi chưa bao giờ đưa ra suy nghĩ này. –

+3

Bạn có thể muốn làm rõ ý nghĩa của từ "lỗi", vì thuật ngữ đó được sử dụng trong một loạt các ngữ cảnh, ngay cả trong thế giới .NET. Ngay cả "ngoại lệ" có thể không rõ ràng giữa Win32 Structured Exception Handling (là cơ chế hệ điều hành Windows để báo cáo lỗi) và quản lý 'System.Exception' (là cơ chế CLR cho các lỗi báo cáo). –

+0

Related (Java-specific): http://stackoverflow.com/questions/912334/differences-betweeen-exception-and-error – Helen

Trả lời

12

Trường hợp ngoại lệ là lớp học tận dụng ngữ nghĩa ngôn ngữ. Như những người khác đã nói, ngoại lệ gián đoạn thực hiện lên stack cho đến khi bị bắt. Một ngoại lệ có thể được sử dụng để truyền đạt lỗi, nhưng thường được sử dụng để truyền đạt một điều gì đó đặc biệt đã xảy ra.

Lỗi, mặt khác, có thể là ngoại lệ hay không.

Có một số loại lỗi:

  • Lỗi người dùng - điều này sẽ bị xử lý mà không có một ngoại lệ
  • Cú pháp lỗi - điều này không nên biên dịch bằng các ngôn ngữ kiểu tĩnh (trong ngôn ngữ năng động, họ một chút khó khăn hơn để khám phá)
  • Runtime lỗi - điều này hoặc là sẽ dẫn đến một ngoại lệ, hoặc âm thầm thất bại (thường tạo ra kết quả bất ngờ)

Thực sự, ngoại lệ s nên được giới hạn để xử lý lỗi thời gian chạy, vì người dùng nhập dữ liệu xấu không phải là "ngoại lệ". Để xử lý các lỗi người dùng, bạn nên dùng các phương pháp sau đây:

  • Ngăn chặn dữ liệu xấu từ việc đầu vào (front-end xác nhận)
  • Ngăn chặn dữ liệu xấu khỏi bị tồn (back-end xác nhận)

Trường hợp ngoại lệ nên được sử dụng làm "hàng phòng thủ cuối cùng" cho lỗi người dùng. Nếu bạn đang viết một lớp kiên trì, bạn có thể dựa vào các ngoại lệ để đảm bảo rằng dữ liệu xấu rơi qua xác thực không được duy trì. Bạn nên, tuy nhiên, sửa chữa bất kỳ trong số này bằng cách đặt một sửa chữa trong xác nhận đó ngăn chặn các lỗi xảy ra ở nơi đầu tiên.

+1

Tôi cho rằng lỗi người dùng có thể được xử lý với ngoại lệ trong nội bộ (ví dụ: phương thức Xác minh trả về ngoại lệ tùy chỉnh). Tuy nhiên, những ngoại lệ đó sẽ bị bắt và báo cáo một cách thân thiện. Đây không phải là luồng kiểm soát bình thường, cũng không có khả năng có tác động hiệu quả. – TrueWill

+0

@TrueWill - Tôi đồng ý. Tôi đã có một nhu cầu sử dụng ngoại lệ bắt/rethrowing như kiểm soát dòng chảy "mô hình" một lần. Đó là một trường hợp kỳ lạ nhưng, tôi rất vui vì có thứ gì đó tồn tại để cho tôi hoàn thành những gì tôi cần ... @Michael, không downvote, nhưng tôi cũng không hoàn toàn đồng ý. – overslacked

+3

Tôi đoán tôi đã không nói nó đủ tốt. Ngoại lệ không nên là cơ chế chính được sử dụng đảm bảo đầu vào phù hợp. Nếu dữ liệu xấu vượt qua xác thực, thì nó trở thành một trường hợp ngoại lệ. Đó là những gì tôi muốn nói khi tôi nói "một ngoại lệ có thể được sử dụng để truyền tải một lỗi." Tôi sẽ làm cho chữ "có thể" nghiêng. –

13

Ngoại lệ là đối tượng thuộc loại bắt nguồn từ lớp System.Exception. Nó được sử dụng trong câu lệnh throw để chuyển điều khiển sang điều khoản catch trong khối try ở đâu đó hơn nữa lên ngăn xếp cuộc gọi.

Lỗi chỉ là một số mã hoặc thông điệp mà bạn muốn diễn giải. Vấn đề với mã lỗi là bạn có thể quyết định bỏ qua chúng:

MethodThatReturnsAnError(); 
SomeCodeThatShouldNotExecuteOnError(); 

Cuộc gọi đó sẽ đơn giản bỏ qua mã lỗi nếu được trả lại. Tuy nhiên:

MethodThatThrowsAnException(); 
SomeCodeThatShouldNotExecuteOnError(); 

Không thể bỏ qua điều này và sẽ chuyển quyền kiểm soát ngăn xếp, qua "SomeCodeThatShouldNotExecuteOnError();".

+0

Tôi không biết liệu tôi có nói rằng có vấn đề với mã lỗi hay không, thay vào đó, với ngoại lệ, bạn có thể tận dụng thực tế rằng "ai đó" sẽ phải xử lý ngoại lệ trong khi lỗi có thể bị bỏ qua. Trường hợp ngoại lệ không tốt hơn lỗi. Họ chỉ là những gì họ được gọi, ngoại lệ. Một cái gì đó đặc biệt đã xảy ra và đang làm gián đoạn quá trình xử lý. –

+4

@LucasB: thực tế là mã lỗi có thể bị bỏ qua _is_ sự cố với mã lỗi. Điều đó cộng với thực tế chúng có trọng lượng nhẹ về mặt ngữ nghĩa. –

+1

Về mặt ngữ nghĩa, ngoại lệ không nhất thiết phải là lỗi, nó chỉ là thứ gì đó sẽ làm gián đoạn đường dẫn mã "bình thường" có lợi cho một mã "ngoại lệ". Phần lớn thời gian có nghĩa là "lỗi", nhưng sau đó chúng ta có thể tham gia vào các cuộc tranh luận ngữ nghĩa về "lỗi" nghĩa là gì. "Lỗi hệ thống", "lỗi lập trình" và "lỗi người dùng" là tất cả "lỗi" khái niệm, nhưng trong mã giao diện người dùng "lỗi người dùng" như nhập giá trị không hợp lệ vào hộp văn bản thường không được coi là "ngoại lệ" ném một ngoại lệ. –

0

Exception: Khi một bước trong một số hành động thất bại, tất cả các bước tiếp theo trong hành động mà chỉ đơn giản là KHÔNG thực thi. Đây là nơi ngoại lệ tỏa sáng.

Lỗi: là khi nào, như trong trường hợp đầu tiên bạn muốn tạm dừng thực thi mã hiện tại, nhưng trước khi bạn thực sự cần phải giải phóng bất kỳ tài nguyên nào được phân bổ trước đó.


Sau những gì đã nói,

lớp Exception có HResult property. HRESULT là giá trị 32 bit, được chia thành ba trường khác nhau: mã mức độ nghiêm trọng, mã cơ sở và mã lỗi .

Hãy nhìn vào bài viết này, sẽ giúp bạn hiểu rõ hơn về

0

Exceptions là một cách để báo cáo và xử lý thất bại thực hiện. Nói cách khác, chúng là để giao tiếp các điều kiện lỗi (diễn giải Krzysztof Cwalina trong cuốn sách Framework Design Guidelines).

2

Trường hợp ngoại lệ, bạn phải viết mã để bỏ qua. Mã lỗi bạn phải viết mã thành không phải là bỏ qua.

+0

Tôi thích điều này, vì vậy tôi đã upvoted. Tuy nhiên, bạn phải hiểu cả hai trường hợp ngoại lệ và lỗi (vâng, các mã lỗi, như bạn nói), để nó kháng cáo. Vì vậy, nhãn hiệu hàng đầu cho sự khéo léo, nhưng tôi không chắc chắn nó thực sự trả lời câu hỏi :) – ChrisA

+0

upvote cho sự hài hước: D – user2330678

2

Thông thường, tôi phân loại chúng như:

Lỗi - là một công việc được biết đến trong các ứng dụng. Ví dụ: Tên người dùng không được cung cấp trong quá trình xác thực là lỗi.
Ứng dụng có thể xử lý các tình huống này & sẽ có thể hiển thị thông báo thân thiện với người dùng để nhắc nhập liệu thích hợp và/hoặc xử lý dữ liệu theo cách khác.

Ngoại lệ - thường được ném khi ra khỏi hệ thống của bạn và/hoặc điều gì đó không mong muốn xảy ra trong ứng dụng. Ví dụ: mở một trình xử lý tệp có thể ném một ngoại lệ do không đủ quyền hoặc tệp không tồn tại.
Thông thường trong trường hợp này, ứng dụng có thể bắt các ngoại lệ này và/hoặc viết một trình xử lý chung để xử lý tất cả các ngoại lệ trong hệ thống.

Theo nguyên tắc, nếu bạn biết một trường hợp cụ thể tồn tại do ứng dụng không thể tiếp tục làm việc, hãy gắn nhãn đó là lỗi & xử lý trường hợp một cách duyên dáng.

Tất cả các 'không xác định không xác định' còn lại có thể rơi vào danh mục Ngoại lệ.

HTH.

1

Nếu không có trình xử lý ngoại lệ cho một ngoại lệ nhất định, chương trình sẽ ngừng thực thi thông báo lỗi.

Ngoại lệ bị lỗi là lỗi. Vì vậy, tất cả các lỗi là ngoại lệ nhưng ngược lại là không đúng sự thật. Kỹ thuật xử lý ngoại lệ xử lý các trường hợp ngoại lệ/không mong muốn (lỗi), trong khi lỗi là các tình huống mà chúng tôi chưa mong đợi xảy ra, do đó, chúng tôi phải chăm sóc chúng bằng cách chuyển hướng người dùng đến một số HTML tĩnh. & đưa ra giải pháp cho lỗi xảy ra.

lỗi có thể xảy ra ở 2 cấp độ

  • cấp độ trang (sử dụng ErrorPage Thuộc tính tại Chỉ thị trang)
  • Application Cấp (Cần phải bị xử lý web.cấu hình)

Compilation CustomError ... CustomError lỗi .... lỗi Compilation Lưu ý- Cấp Trang Lỗi xử lý đè Application Cấp Xử lý lỗi.

Xử lý ngoại lệ: ->

0

lỗi là những sự kiện. Lớp ngoại lệ biểu diễn các lỗi xảy ra trong quá trình thực thi ứng dụng (runtime) và cung cấp một cơ chế để xử lý chúng bằng cách sử dụng các khối catch try. Lỗi có thể là lỗi thời gian chạy hoặc trình biên dịch.

Ví dụ về các sự kiện lỗi: HttpApplication.Error tổ chức sự kiện của System.Web dll, FileSystemWatcher.Error tổ chức sự kiện của System.IO Cả dlls có cùng định nghĩa của sự kiện Lỗi

public event EventHandler Error 

Từ .Net Framework 4.5 tài liệu https://msdn.microsoft.com/en-us/library/system.exception(v=vs.110).aspx

Lớp ngoại lệ biểu thị lỗi xảy ra trong quá trình thực thi ứng dụng.

lỗi và ngoại lệ

lỗi Run-thời gian có thể xảy ra vì nhiều lý do. Tuy nhiên, không phải tất cả các lỗi đều được xử lý như các ngoại lệ trong mã của bạn. Dưới đây là một số loại lỗi có thể xảy ra vào thời gian chạy và các cách thích hợp để phản hồi chúng.

Lỗi sử dụng. Lỗi sử dụng biểu thị lỗi trong logic chương trình có thể dẫn đến ngoại lệ. Tuy nhiên, lỗi phải được giải quyết không thông qua xử lý ngoại lệ mà bằng cách sửa đổi mã bị lỗi.

Lỗi chương trình. Lỗi chương trình là lỗi thời gian chạy không nhất thiết có thể tránh được bằng cách viết mã không có lỗi.

Trong một số trường hợp, lỗi chương trình có thể phản ánh tình trạng lỗi dự kiến ​​hoặc lỗi thông thường. Trong trường hợp này, bạn có thể muốn tránh sử dụng xử lý ngoại lệ để xử lý lỗi chương trình và thay vào đó thử lại thao tác.

Trong các trường hợp khác, lỗi chương trình phản ánh điều kiện lỗi không mong muốn có thể được xử lý trong mã của bạn.

Lỗi hệ thống. Lỗi hệ thống là lỗi thời gian chạy không thể xử lý theo chương trình một cách có ý nghĩa. Ví dụ, bất kỳ phương thức nào cũng có thể ném ngoại lệ OutOfMemoryException nếu thời gian chạy ngôn ngữ chung không thể cấp phát bộ nhớ bổ sung. Thông thường, lỗi hệ thống không được xử lý bằng cách sử dụng xử lý ngoại lệ. Thay vào đó, bạn có thể sử dụng một sự kiện như AppDomain.UnhandledException và gọi cho Environment.Phương pháp FailFast để ghi lại thông tin ngoại lệ và thông báo cho người dùng về lỗi trước khi ứng dụng chấm dứt.

Các vấn đề liên quan