2010-04-25 43 views
5

Tôi đang viết ứng dụng aC# và muốn xuất thông báo lỗi cho giao diện điều khiển hoặc hộp thư (Tùy thuộc vào loại ứng dụng: enum AppTypeChoice {Console, Windows}) và cũng kiểm soát thời tiết ứng dụng tiếp tục chạy hay không (bool StopOnError)).Tại sao có mã không thể truy cập ở đây?

Tôi đã đưa ra phương pháp này sẽ kiểm tra tất cả các tiêu chí, nhưng tôi nhận được cảnh báo "không thể truy cập mã không thể truy cập". Tôi không thể hiểu tại sao!

Dưới đây là toàn bộ phương pháp (mình Brace cho một số mã hobbyist!)

 

    public void OutputError(string message) 
    { 
     string standardMessage = "Something went WRONG!. [ But I'm not telling you what! ]"; 
     string defaultMsgBoxTitle = "Aaaaarrrggggggggggg!!!!!"; 
     string dosBoxOutput = "\n\n*** " + defaultMsgBoxTitle + " *** \n\n Message was: '" + message + "'\n\n"; 
     AppTypeChoice appType = DataDefs.AppType; 
     DebugLevelChoice level = DataDefs.DebugLevel; 

     // Decide how much info we should give out here... 
     if (level != DebugLevelChoice.None) 
     { 
      // Give some info.... 
      if (appType == AppTypeChoice.Windows) 
       MessageBox.Show(message, defaultMsgBoxTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); 
      else 
       Console.WriteLine(dosBoxOutput); 
     } 
     else 
     { 
      // Be very secretive... 
      if (appType == AppTypeChoice.Windows) 
       MessageBox.Show(standardMessage, defaultMsgBoxTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); 
      else 
       Console.WriteLine(standardMessage); 
     } 

     // Decide if app falls over or not.. 
     if (DataDefs.StopOnError == true) 
      Environment.Exit(0); // UNREACHABLE CODE HERE 
    } 
 

Ngoài ra, trong khi tôi có sự chú ý của bạn, để có được các loại ứng dụng, tôi chỉ sử dụng một hằng số ở đầu các tập tin (ví dụ: AppTypeChoice.Console trong một ứng dụng Console vv) - là có một cách tốt hơn để làm điều này (tôi có nghĩa là tìm ra trong mã nếu nó là một ứng dụng DOS hoặc Windows)?

Ngoài ra, tôi nhận thấy rằng tôi có thể sử dụng hộp thư với đường dẫn đủ điều kiện trong ứng dụng Console ... Làm thế nào xấu là làm điều đó (ý tôi là, tôi sẽ bị hắc ín và có lông khi các nhà phát triển khác xem không? !)

Nhờ sự giúp đỡ của bạn

+0

Đó là toàn bộ phương pháp? –

+1

@Raj: Nhìn vào dòng cuối cùng. – SLaks

+0

Cảm ơn bạn! –

Trả lời

1

Look đặc biệt tại mã này ...

DebugLevelChoice level = DataDefs.DebugLevel; 

     // Decide how much info we should give out here... 
     if (level != DebugLevelChoice.None) 

Đoạn mã trên sẽ không thể truy cập bởi vì bạn thiết lập level luôn luôn được DebugLevel vì thế nó sẽ không bao giờ None . Nó sẽ giúp chúng tôi hơn nữa nếu bạn có thể cho chúng tôi biết thêm về những gì lỗi nói, ví dụ, những gì dòng của nó trên hoặc có mã là không thể truy cập.

+0

Sai. Vì nó không phải 'const', điều đó sẽ không đưa ra lỗi. (Tôi đã kiểm tra) – SLaks

+0

-1. Làm thế nào để trình biên dịch biết liệu DataDefs.DebugLevel có bao giờ có thể là None hay không? Ngoài ra, mã không thể truy cập không nằm trong câu lệnh if. – Joren

+0

@ Joren: Nó không có, và đó không phải là nơi xảy ra lỗi. Câu trả lời này là sai. – SLaks

0

Thực tế là bạn đang sử dụng hằng số trong câu lệnh có điều kiện chính xác là lý do bạn thấy thông báo này. Trình biên dịch cho bạn biết rằng một trong các đường dẫn trong câu lệnh đó không bao giờ có thể được thực thi vì điều này thường chỉ ra một vấn đề logic.

Vì vậy, nếu như bạn nói bạn xác định appType như một hằng số (AppTypeChoice.Console) thì mệnh đề đầu tiên trong khối này sẽ không bao giờ được thực thi:

// Give some info.... 
if (appType == AppTypeChoice.Windows) 
    MessageBox.Show(message, defaultMsgBoxTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); 
else 
    Console.WriteLine(dosBoxOutput); 
+0

vâng, tôi thấy nó ngay bây giờ - Tôi muốn thiết lập cho mỗi chương trình (Console hoặc Windows), và KHÔNG có nó như là một hằng số. Duh! Tôi KHÔNG TIN TỨC rằng tôi đã bỏ lỡ điều đó! Cảm ơn các bạn – Richard

+0

Cảm ơn tất cả các bạn đã giúp đỡ - Tôi vừa thu thập thêm một chút kiến ​​thức về C#! – Richard

2

Nếu giá trị của DataDefs.StopOnError là sai, thì nội dung của "if" sẽ không thể truy cập được. Kiểm tra xem đó có phải là mặc định không.

+3

Có, nhưng chỉ khi đó là 'const'. – SLaks

10

DataDefs.StopOnError là hằng số biên dịch theo thời gian bằng false.

Do đó, trình biên dịch sẽ thay thế bằng false (Hoặc bất cứ điều gì bạn đặt) vào gần đầu của quá trình kết hợp.

Do đó, mã của bạn biên dịch để:

if (false == true) 
    Environment.Exit(0); // UNREACHABLE CODE HERE 

này rõ ràng là không thể truy cập.

Giải pháp đơn giản nhất là tạo trường DataDefs.StopOnErrorreadonly thay vì const.

Trình biên dịch sẽ chỉ đưa ra cảnh báo này nếu tất cả các giá trị có liên quan là hằng số biên dịch hoặc chữ, vì vậy việc sử dụng bất kỳ loại trường nào khác cho DataDefs.StopOnError sẽ dừng cảnh báo.

+0

Ah ... Vậy khi nào nó trở thành giá trị tôi muốn nó? hoặc làm cách nào để biến nó thành giá trị mà tôi chống lại? – Richard

+1

Ý của bạn là gì? – SLaks

0

Về hộp thư, bạn không nên sử dụng hộp thông báo để báo cáo dữ liệu từ dòng lệnh. Khi một hộp thông báo bật lên, nó sẽ ngăn chương trình dòng lệnh kết thúc thực hiện cho đến khi người dùng tương tác với nó. Điều này có thể dẫn đến các vấn đề khi một số chương trình khác gọi chương trình của bạn và không có ai xung quanh bấm OK. Nó là tốt hơn để sử dụng giao diện điều khiển cho đầu ra lỗi; các nhà phát triển khác sẽ cảm ơn bạn đã cứu họ khỏi phải hack xung quanh hộp thư.

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