Có nhiều câu hỏi (1, 2, 3, 4 v.v.) được gọi là "Tại sao ngoại lệ này không bị bắt". Đáng buồn thay, không có giải pháp nào làm việc cho tôi ... Vì vậy, tôi bị mắc kẹt với một ngoại lệ thực sự không thể sửa chữa được.Moby Dick của ngoại lệ
Tôi có một đoạn mã (.NET 4.0) kiểm tra một tệp văn bản lớn cho các chữ số và số. Trong khi thử nghiệm tôi nhận được một ngoại lệ thời gian chạy:
Những gì bạn thấy ở đây là một mô hình try-catch với một catchblock cho một ArgumentOutOfRangeException. Nhưng trong thời gian chạy, khối try ném một ArgumentOutOfRangeException mà không bị bắt.
Tôi đọc phần C# language specification về cấu trúc try-catch, và nó nói:
Một khối catch của một câu lệnh try có thể truy cập nếu câu lệnh try có thể truy cập.
Vì vậy, trong lý thuyết, mã trên phải bắt ngoại lệ. Sau đó tôi nghĩ rằng nó có thể có một cái gì đó để làm với thực tế là mã này đang chạy trong một nhiệm vụ (trong quá trình xử lý của textfile tôi cũng muốn cập nhật giao diện người dùng vì vậy tôi làm điều đó không đồng bộ).. Tôi tìm kiếm xung quanh và sau đó tôi tìm thấy this câu trả lời của Jon Skeet. Về cơ bản cho thấy tôi sử dụng Task.Wait trong một khối try-catch để bắt bất kỳ ngoại lệ nào.
Vấn đề tôi đang gặp phải hiện tại là tôi không thể gọi Task.Wait vì điều đó sẽ chặn chuỗi gọi là chuỗi giao diện người dùng của tôi! Sau đó, tôi đoán rằng tôi có thể tạo ra một tasklayer thêm để chờ đợi cho nhiệm vụ đó:
//Code called from the UI
System.Threading.Tasks.Task.Factory.StartNew(()=>
{
//Create a new task and use this task to catch any exceptions
System.Threading.Tasks.Task task = System.Threading.Tasks.Task.Factory.StartNew(MethodWithException);
try
{
task.Wait();
}
catch(Exception)
{
MessageBox.Show("Caught it!");
}
});
Nhưng điều này vẫn cho kết quả tương tự ... Sau đó, tôi nghĩ rằng nó có thể là vì thực tế tôi không đủ với cụ Loại trừ của tôi. Nhưng Thông số kỹ thuật ngôn ngữ C# nêu rõ:
Một số ngôn ngữ lập trình có thể hỗ trợ các ngoại lệ không thể đại diện cho đối tượng có nguồn gốc từ mã C#.
Vì vậy, trừ khi bạn sử dụng một số API bên thứ ba sơ sài, bạn luôn luôn tốt khi bạn sử dụng Exception
. Vì vậy, tôi thấy mình với một câu trả lời được đề xuất bởi Jon Skeet mà không hoàn toàn làm việc cho tôi. Đó là khi tôi biết tôi chỉ nên ngừng thử ...
Vì vậy, không ai biết điều gì đang xảy ra? Và làm thế nào tôi có thể sửa lỗi này? Tôi biết tôi chỉ có thể kiểm tra nếu i
bằng hoặc lớn hơn text.Length
nhưng hiểu được điều gì đang xảy ra quan trọng hơn mã làm việc.
Nó cũng không bị mất mà không có một cơ thể 'catch' trống rỗng? –
Bạn có chắc chắn 100% rằng ngoại lệ đó không được giải quyết? Có thể bạn chỉ cần thiết lập tùy chọn để phá vỡ bất kỳ trường hợp ngoại lệ trong Visual Studio? – Andrey
Bạn đã thử chạy chương trình bên ngoài IDE VS chưa? – Steve