2016-09-26 9 views
1

asp.net이 예외를 throw 할 때 예외 객체는 스택 추적 속성을 포함하지만 하나의 큰 긴 문자열입니다. 프로그래밍 방식으로 검사 할 수있는 배열이나 다른 구조로 가져 오는 방법이 있습니까?은 .net 스택 추적을 배열로 가져 오는 방법입니까?

내 직접적인 문제는 지금 관리자 기능에 버그가 있다는 것입니다. 재현하기가 어렵 기 때문에 예외가 발생했을 때 스택 전체를 덤프하는 대신 예외를 잡아 내 코드 내에서 가장 낮은 수준의 명령문을 검색하여 표시합니다. 좋아요, 아마도 이것이 가치있는 것보다 더 많은 문제가 될 수 있습니다. 스택을 덤프하고 버그를 찾아 수정 한 다음 스택 덤프를 추출해야합니다. 하지만 지금은 가능하면 궁금합니다.

RE 중복 : 아니오, 내 질문이 아닙니다. 예외를 던지지 않고 스택 추적을 얻는 방법을 묻지는 않습니다. 내가 예외를 잡았을 때, 스택이나 문자열 대신에 배열이나 다른 구조체로 스택 트레이스를 얻을 수 있는지 묻고있다.

+1

의 사용 가능한 복제 [? 예외없이 .NET에서 현재의 스택 추적을 인쇄하는 방법 (HTTP : 드디어 다음

try { dv = dt.DefaultView; } catch (Exception ex) { var username = getusername(); Globals.SendError(username, ref ex); dv= null; } 

이메일을 보내는 방법입니다 : //stackoverflow.com/questions/531695/how-to-print-the-current-stack-trace-in-net-without-any-exception) –

+1

'System.Diagnostics.StackTrace'? –

답변

0

내 웹 사이트에는 예외로 인한 오류보고를위한 두 가지 옵션이 있습니다.

  1. 오류 이메일
  2. 오류 로그 테이블

오류 이메일 옵션은 아마 구현하는 가장 쉬운 방법입니다. 이메일 본문은 예외 객체에서 추출한 오류 정보로 원하는만큼 길어질 수 있습니다.

web.config 파일의 < appSettings > 섹션에 오류 전자 메일 배포 목록을 쉼표로 구분 된 문자열로 정의하면 웹 사이트 오류를 ​​알리는 사람과 알 수없는 사람에 대한 향후 업데이트를 용이하게 할 수 있습니다.

+0

예, 여러 다른 응용 프로그램에서이 작업을 수행했습니다. 하지만 내 질문은 스택 추적을 "전달"하는 방법이 아니라 프로그램을 조작하여 관심 대상이 될 가능성이 가장 높은 부분을 추출하고자했습니다. 원래의 질문에서 말했듯이, 틀림없이 이것은 시간 낭비입니다. 스택 추적을 조사하고 문제를 해결하기까지 필요한 정보를 찾아내는 코드를 작성하는 데 더 많은 시간을 할애 할 것입니다. 그러나 나는 이것이이 특별한 경우에있어서 최선의 해결책이 아니더라도, 미래의 참고를 위해 어떻게 하는지를 아는 것이 좋은 방법 일 것이라고 생각해야합니다. – Jay

+0

나중에 분석을 위해 스택 추적을 표시하는 사용자 정의 된 코드를 작성하는 것의 노력에 대한 좋은 지적을 제기합니다. 내 웹 사이트의 경우시의 적절하고 유익한 오류 이메일에 대한 보상은 그만한 가치가있었습니다. 이러한 이메일을 생성하는 데 사용되는 방법은 계속 발전하고 있습니다. 귀하의 마일리지는 다를 수 있습니다. – JohnH

0

가장 좋은 방법은 예외가있을 때 이메일을 보내는 것입니다. 당신은 이메일에서 더 쉽게 그것을 읽을 수 있고 이런 식으로 오류를 놓칠 수 없을 것입니다.

C 번호 :

public void SendError(string username, ref Exception ex) 
{ 
    var error = string.Empty; 
    try 
    { 
     username = username.Trim(); 
     var site = ex.TargetSite; 
     var functionName = site == null ? null : site.Name; 

     error = 
      string.Format(
       "Error in (your application name here).\r\nFunction Name: {0}. Failed.\r\nStackTrace: {1}.\r\nMessage: {2}.\r\nDateTime: {3}.", 
       functionName, ex.StackTrace.Trim(), ex.Message.Trim(), DateTime.Now); 

     if (string.IsNullOrEmpty(username)) 
      error += "\r\nEOM."; 
     else 
      error += string.Format("\r\nUsername: {0}\r\nEOM.", username); 

     error = error.Trim(); 

     //If there's an error try to send an email letting me know. 
     var client = new SmtpClient("mail.xyz.com", 25); //replace xyz with your domain 
     var mailMessage = new MailMessage("[email protected]", "[email protected]", 
      "Error in (Your application name here) Report", error); 
     client.Send(mailMessage); 
     client.Dispose(); 
     mailMessage.Dispose(); 
    } 
    catch (Exception) 
    { 
     // ignored 
    } 

    UpdateErrorHistory(error, username); 
}