C# 캡처 예외 상세 정보
4783 단어 C#
예외 포착
//
private void test()
{
int i = 0;
i = 12 / i;
}
//
private void button1_Click(object sender, EventArgs e)
{
try
{
test();
}
catch (Exception ex)
{
this.textBox1.Text = ex.ToString();
}
}
오류 정보:
System.DivideByZeroException: 0으로 나누려고 합니다.ExceptionTest에서Form1.test() 위치 C:\Documents and Settings\Administrator\데스크톱\ExceptionTest\Form1.cs: 행 번호 25는 ExceptionTest에 있습니다.Form1.button1_Click(Object sender, EventArgse) 위치 C:\Documents and Settings\Administrator\데스크톱\ExceptionTest\Form1.cs: 행 번호 33
오류 정보를 통해 오류 줄이 i=12/i임을 알 수 있습니다.이 직업.
문제 포착
실제로 우리는 이상을 포착한 후 처리가 끝난 후에 이상을 호출 프로그램에 던질 수 있다
//
private void button2_Click(object sender, EventArgs e)
{
try
{
test1();
}
catch (Exception ex)
{
this.textBox1.Text = ex.ToString();
}
}
private void test1()
{
try
{
test();
}
catch (Exception ex)
{
// ...
throw ex;
}
}
오류 정보:
System.DivideByZeroException: 0으로 나누려고 합니다.ExceptionTest에서Form1.test1() 위치 C:\Documents and Settings\Administrator\데스크톱\ExceptionTest\Form1.cs: 행 번호 63은 ExceptionTest에 있습니다.Form1.button2_Click(Object sender, EventArgse) 위치 C:\Documents and Settings\Administrator\데스크톱\ExceptionTest\Form1.cs: 행 번호 46
오류 정보를 통해 오류 줄이throw ex임을 알 수 있습니다.이 직업.위의 오류 제시에 의하면 근본적인 오류 원인을 발견하기 어렵다.왜 알림이 없습니까 i = 12/i;행착오는요?코드가trycatch를 사용하여 제로 오류를 제거하고 포획한 후에 이 이상을 던졌기 때문입니다!또 외부 함수에 포착된 후 오류에throw시 오류 줄 정보만 남겼습니다.
그러면 어떻게 해야만 구체적인 이상을 얻을 수 있습니까?
//
private void button3_Click(object sender, EventArgs e)
{
try
{
test2();
}
catch (Exception ex)
{
this.textBox1.Text = ex.ToString();
}
}
private void test2()
{
try
{
test();
}
catch (Exception ex)
{
//
throw new Exception(" !", ex);
}
}
오류 정보:
System.Exception: 오류! --->System.DivideByZeroException: 0으로 나누려고 합니다.ExceptionTest에서Form1.test() 위치 C:\Documents and Settings\Administrator\데스크톱\ExceptionTest\Form1.cs: 행 번호 25는 ExceptionTest에 있습니다.Form1.test2() 위치 C:\Documents and Settings\Administrator\데스크톱\ExceptionTest\Form1.cs: 줄 번호 84 --- 내부 이상 창고 추적의 끝 --- ExceptionTest.Form1.test2() 위치 C:\Documents and Settings\Administrator\데스크톱\ExceptionTest\Form1.cs: 행 번호 89는 ExceptionTest에 있습니다.Form1.button3_Click(Object sender, EventArgse) 위치 C:\Documents and Settings\Administrator\데스크톱\ExceptionTest\Form1.cs: 줄 번호 72
throw new Exception 때문에ex); 새 사용자 정의 이상을 다시 만들고 원본 이상을 innerException으로 설정합니다.그래서 이상 정보에는 여러 차원의 이상 정보가 포함되어 있다.
DEBUG RELEASE 버전의 차이점에 대해 설명합니다.
이상 정보는 DEBUG 모드입니다.DEBUG RELEASE는 VS 디버깅 상태에서 동일한 결과를 가져옵니다.RELEASE가 독립적으로 실행될 때 RELEASE 모드에서는 예외 테스트가 없습니다.pdbSystem.Exception: 오류! --->System.DivideByZeroException: 0으로 나누려고 합니다.ExceptionTest에서Form1.test2() --- 내부 비정상 스택 추적의 끝 --- ExceptionTest.Form1.test2()는 ExceptionTest에 있습니다.Form1.button3_클릭(Object sender, EventArgse) RELEASE 모드에서 시스템.Exception: 오류! --->System.DivideByZeroException: 0으로 나누려고 합니다.ExceptionTest에서Form1.test2() 위치 C:\Documents and Settings\Administrator\데스크톱\ErrorLog\ExceptionTest\Form1.cs: 줄 번호 84 --- 내부 이상 창고 추적의 끝 --- ExceptionTest.Form1.test2() 위치 C:\Documents and Settings\Administrator\데스크톱\ErrorLog\ExceptionTest\Form1.cs: 행 번호 89는 ExceptionTest에 있습니다.Form1.button3_Click(Object sender, EventArgse) 위치 C:\Documents and Settings\Administrator\데스크톱\ErrorLog\ExceptionTest\Form1.cs: 줄 번호 72
총결산
이상을 포착하고 던질 때throw new Exception을 사용해야 합니다.ex); 방식, 이상 구체적인 위치를 얻을 수 있습니다.
VS 디버깅 또는 DEBUG 모드에서 프로그램을 실행하면 이상이 발생하는 구체적인 위치를 얻을 수 있습니다.
그러나 독립적으로 실행되는 RELEASE 모드에서 이상은 최초의 호출 위치만 기록합니다.
실행 디렉터리에 *가 없으면pdb 파일의 경우 이상 정보에는 코드와 줄 번호가 포함되지 않습니다.
테스트 코드 다운로드
다운로드:http://files.cnblogs.com/zjfree/ErrorLog.rar
환경: WIN2003 + VS2005 + C#
보충하다
경원우고검 지정!catch가 이상하면 처리하지 않고 throw를 쓰면 되고,throw ex를 사용하지 않습니다.예는 다음과 같습니다.
try
{
test();
}
catch
{
//
throw;
}
예외 없이 처리할 경우 다음과 같이 쓰십시오.
try
{
test();
}
finally
{
//
}
테스트를 통해 완전히 정확합니다!예전에는 정말 이렇게 해도 되는지 몰랐다.땀!깨우쳐 주셔서 감사합니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.