Nếu (false == true) thực thi khối khi ném ngoại lệ vào bên trong


152

Tôi có một vấn đề khá kỳ lạ đang xảy ra.

Đây là mã của tôi:

private async Task BreakExpectedLogic()
{
    bool test = false;
    if (test == true)
    {
        Console.WriteLine("Hello!");
        throw new Exception("BAD HASH!");
    }
}

Có vẻ rất đơn giản, nó không nên nhấn Console.WriteLinehoặc throw. Vì một số lý do, nó luôn luôn nhấn throw.

Nếu tôi di chuyển throwvào phương thức riêng của nó thì nó hoạt động tốt. Câu hỏi của tôi là làm thế nào nó bỏ qua ifkhối và nhấn throw new Exception:

Đây là một số bằng chứng

EDIT 1: Tôi đã cập nhật mã của mình để bao gồm chữ ký, tôi đã xóa mọi thứ không liên quan đến vấn đề này và chạy nó, nó vẫn xảy ra.


5
@TimSchmelter bức ảnh đang được gỡ lỗi, điểm nổi bật màu vàng là nơi mã đang ở
George

5
Tôi vừa tạo một ứng dụng bảng điều khiển lõi trống, chỉ dán mã của bạn vào Mainvà .... bất ngờ, norepro. Hoặc bạn đã nhầm hoặc bạn đã bỏ lỡ một số chi tiết quan trọng.
Jamiec

16
Đây có phải là một asyncphương pháp trong bất kỳ cơ hội? Bởi vì nó có vẻ giống với stackoverflow.com/questions/42528458/ từ
Matthew Watson

7
@George: vẫn không có bằng chứng vì bạn có thể sử dụng các biểu tượng gỡ lỗi cũ. Biên dịch lại trong chế độ gỡ lỗi và sau đó bắt đầu lại.
Tim Schmelter

4
@TimSchmelter Tôi đã biên dịch lại, làm sạch, mở lại dự án đã thử các cách khác nhau để làm nếu, nhưng vẫn giống nhau
George

Câu trả lời:


176

Nó dường như là lỗi trong asyncphương thức, mã không thực sự được thực thi mà là trình gỡ lỗi bước đến dòng với throwcâu lệnh. Nếu có một số dòng mã trước khi throwcâu lệnh bên trong ifcác dòng này bị bỏ qua, trình gỡ lỗi chỉ đến dòng với throwcâu lệnh.

Ngoài ra, nếu bạn không sử dụng biến - if (false)hoặc if (true == false)sau đó là các bước gỡ lỗi cho dòng mã chính xác - để đóng dấu ngoặc nhọn.

Lỗi này đã được @Matthew Watson đăng lên nhóm Visual Studio (liên kết hiện không có sẵn).

Ngoài ra, xem câu hỏi tương tự - Kiểm tra điều kiện trong phương pháp async

EDIT (2017/10/06):

Vấn đề không thể được sao chép trong VS 2017 15.3.5 bằng .Net Framework 4.7. Có vẻ như nhóm VS đã khắc phục vấn đề này.


20
Cảm ơn bạn, mà không biết đây là một lỗi trong trình gỡ lỗi, tôi có thể sẽ phát điên.
George

121
Một lỗi trong trình gỡ lỗi? Làm thế nào rất meta. :) (hát tôi chưa bao giờ gặp lỗi meta như thế này trước đây ... )
Simba

3
@George Tôi hy vọng bạn không phiền, tôi đã lấy mẫu của bạn và tạo một ứng dụng bảng điều khiển bằng cách sử dụng nó và gắn nó với vấn đề VS mà Roma đã liên kết.
Obsidian Phoenix

5
@Simba: Hãy cho tôi biết bạn chưa bao giờ sử dụng trình gỡ lỗi để gỡ lỗi.
Joshua

3
Hừm. Có vẻ như lỗi có thể nằm trong thông tin gỡ lỗi được tạo bởi trình biên dịch chứ không phải trong chính trình gỡ lỗi. Tôi sẽ đợi MS xác nhận lỗi Connect trước khi bỏ phiếu lên hoặc xuống.
Adrian McCarthy ngày

10

Chỉ là phần phụ lục cho câu trả lời, gần đây tôi đã gặp phải vấn đề tương tự và đã xem mã x86 thực tế trong trình gỡ lỗi và nó được tạo theo cách kỳ lạ như thế này (đơn giản hóa):

// if (...) {
0001: jne 0006
...
0006: jmp 0007
// }
0007: ret

Vì vậy, thay vì nhảy trực tiếp đến các hướng dẫn cuối cùng của phương thức, nó thực hiện bước nhảy kép, trong đó tôi tin rằng bước nhảy vô điều kiện thứ hai bị nhận nhầm là một phần của mã bên trong ifkhối.

Vì vậy, tôi sẽ suy đoán rằng lỗi này có thể liên quan đến trình biên dịch JIT.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.