2013-05-24 5 views
1

기본적인 예외 처리 방법을 알고 있습니다. 그래서 'try except'메소드를 사용하여 0으로 나누면 메시지를 올릴 수 있습니다.델파이에서 0으로 나눈 값 나누기를 일으킨 변수를 얻거나 찾는 방법?

내가 뭘하고 싶은지,이 오류를 일으키는 변수를 찾아 런타임에 값을 변경하십시오. 예를 들어

:

procedure Calculate(); 
var 
    a, b, c : Double; 
begin 
    try 
    a := 4; //suppose i take this value from user and he enters 4 
    b := 0; //suppose i take this value from user and he enters 0 
    c := a/b; 
    ShowMessage(FloatToStr(c)); 
    except 
    on E : EZeroDivide do 
    begin 
     ShowMessage('Exception message = '+E.Message); 

//i am not sure how to identify that its variable 'b' that is causing the error and has to be changed by a default value 

     get(E....errorVaraiable); 
     E....errorVaraiable := 0.00001; 
     c := a/E....errorVariable; 

     ShowMessage(FloatToStr(c)); 
    end; 
    end; 

, 사람이 좀 도와 줄래하세요?

+1

자세히 설명해주세요. 당신은 런타임시에 마술을 찾고, 잘못된 부분을 해결하고 적절한 기본값으로 계산을 다시합니다. 나는 네가 무엇을 요구하고 있는지 이해하지 못한다. 내 말은, 당신은 우리에게 당신이 b가 0이라고 말할 수는 없다는 뜻입니다. –

+0

글쎄요, 저는 마술을 찾고 있지 않습니다. 내 코드에서 오류가 발생한 위치/주소/지점을 찾는 방법을 찾고 있습니다. 예를 들어, E.Message를 사용하여 오류 메시지를받습니다. 코드에서이 오류의 원인이되는 오류 위치 또는 변수를 얻을 수 있습니까? – Arjun

+0

질문이 내게 의미가 없습니다. '제로로 나누기'오류는 제수 (나누기 연산자의 오른쪽에있는 값)에 의해 항상 발생하므로 게시 한 코드에서 항상 'b'이고 'c/d'에서는 항상 ' 'd'. 디비전 이전에 유효성을 검사하는 것에 대해 걱정이된다면 사용자가 전달할 수있는 값 (예 :'TSpinEdit')을 사용하거나 코드를 체크하는 것으로 제한하십시오. 주장을 시작하십시오 (Divisor <> 0); 결과 : = 분자/제수; 끝, ' –

답변

2

다음은 원하는대로 수정 한 예제입니다.

procedure Calculate(); 
var 
    a, b, c : Double; 
begin 
    a := 4; //suppose i take this value from user and he enters 4 
    b := 0; //suppose i take this value from user and he enters 0 
    if IsZero(b) then 
    begin 
    ShowMessage('b cannot be 0') 
    end 
    else 
    begin 
    c := a/b; 
    ShowMessage(FloatToStr(c)); 
    end; 
end; 
+0

고맙습니다. 응답이 적습니다. 변수가 거의없는 경우 좋은 방법이 될 수 있습니다. 내 실제 코드에서는 데이터베이스에서 많은 변수를 읽었고 사용자가 적은 수의 항목을 읽었으며 수식을 사용하기 전에 각 항목을 확인하는 것은 비현실적이었습니다. 오류가 있는지 확인하고 값이 0 인 변수에만 작업하는 것이 더 좋지 않습니까? – Arjun

+0

@Arjun 여러분이 마술이 일어나기를 바라고있는 것처럼 들립니다. –

+0

@Arjun, 많은 변수와 많은 코드가 있다면, 모든 것에 대해'EZeroDivide '를 잡는 이점을 실제로 볼 수 없습니다. 특히 오류가 발생한 위치 나 이유를 알 수 없습니다. 그 특정 정보로 무엇을 할 것입니까? –