2013-07-19 18 views
5

Tôi đang chạy một số mã chỉ chạy một lần nhưng nó phụ thuộc vào tài nguyên bên ngoài và có thể bị lỗi. Tôi muốn lỗi xuất hiện trong bản ghi sự kiện nhưng tôi không muốn người dùng nhìn thấy nó. Tôi muốn tránh sử dụng các trang lỗi tùy chỉnh nếu có thể.Cách sạch nhất để phát hiện lỗi nhưng không hiển thị cho người dùng rằng nó đã bị lỗi (không có trang lỗi tùy chỉnh)

Tôi có thể bắt ngoại lệ và ghi nó vào bản ghi sự kiện nhưng tôi lo ngại rằng tôi không thể đảm bảo tên của nguồn sự kiện asp.net sẽ là gì (dường như thay đổi tùy thuộc vào phiên bản khung công tác .) Tôi cũng không thể tạo nguồn sự kiện của riêng mình vì yêu cầu quyền quản trị.

Phương pháp mà tôi hiện đang làm việc hướng tới là một chút của một hack (mà không làm việc được nêu) và nó trông như thế này:

public void Init(HttpApplication context) 
    { 
     try 
     { 
      throw new Exception("test"); // This is where the code that errors would go 
     } 
     catch (Exception ex) 
     { 
      HttpContext.Current.Application.Add("CompilationFailed", ex); 
     } 
    } 

    private void context_BeginRequest(object sender, EventArgs e) 
    { 
     if (HttpContext.Current.Application.AllKeys.Contains("CompilationFailed")) 
     { 
      // It failed on Init - we can't throw an exception there so lets try it here 

      var origEx = (Exception)HttpContext.Current.Application["CompilationFailed"]; 
      // Only ever do this once 
      HttpContext.Current.Application.Remove("CompilationFailed"); 

      // This should just look like a normal page load to the user 
      // - it will be the first request to the site so we won't be 
      // interrupting any postbacks or anything 


      HttpContext.Current.Response.AddHeader("Location", "/"); 
      HttpContext.Current.Response.StatusCode = 301; 
      try 
      { 
       HttpContext.Current.Response.End(); 
      } 
      catch (ThreadAbortException ex) 
      { 
       throw origEx; 
      } 
     } 
    } 

Lý tưởng nhất là những gì tôi thực sự muốn là một RecordException () trong IIS nếu có bất cứ thứ gì như thế tồn tại.

+0

EnterpriseLoggingLibrary là công cụ tuyệt vời cho những thứ như thế này - có thể ghi lại ngoại lệ cho cơ sở dữ liệu, Nhật ký sự kiện Windows, tệp văn bản hoặc bất kỳ điều gì khác mà bạn có thể nghĩ đến. –

Trả lời

5

Tôi khuyên bạn nên Elmah cho ASP.NET.

+1

Bản trình diễn Elmah http://www.youtube.com/watch?v=xAcH41ZSksU – prospector

+0

Trông giống như một giải pháp tốt. Cảm ơn. – JoeS

1

có vẻ như bạn muốn được thông báo khi có lỗi nhưng không muốn người dùng biết về điều đó. bạn có thể có chuyển hướng trang (nếu Fatal Error) hoặc hoàn thành việc thực hiện phần còn lại của tệp/trang sau khi gửi cho bạn một E-mail hoặc ghi vào nguồn dữ liệu mà bạn có quyền truy cập.