Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Exception
#1
Merhaba

aşağıdaki kodda aynı veri içerisindeki kodu tekrar çekmeye çalıştığımda exception a düşüyor. Bunu sebebi nedir?

  try
    VeriObj    := TJSONObject.ParseJSONValue(Rrequest.Content) as TJSONObject;
   VeriValue := VeriObj.GetValue('TRANSACTIONS');
   VeriAry   := VeriValue.GetValue<TJSONArray>('items');
         // FATURA SATIRLARI Kontrol
        if not FatHataVar then
           begin
             for SatI := 0 to VeriAry.Count-1 do
                 begin
                     MlzObj := TJsonObject.Create;
                     try
                      MlzObj := TJSONObject(VeriAry.Get(SatI));
                      S_MCODE := MlzObj.GetValue('URUN_KODU').Value;
                      ..........
                     finally
                      MlzObj.Free;
                     end;
                 end;
           end;

        // FATURA SATIRLARI Kayıt
        if not FatHataVar then
           begin
            for SatI := 0 to VeriAry.Count-1 do
                 begin
                     MlzObj := TJsonObject.Create;
                     try
                      MlzObj  := TJSONObject(VeriAry.Get(SatI));
                      /// >>>>>>>>>>>>>>>>>>>>>> ????
                      S_MCODE := MlzObj.GetValue('URUN_KODU').Value; // <<<<<<< EXCEPTION
                      /// >>>>>>>>>>>>>>>>>>>>>> ????
                      ...
                     finally
                      MlzObj.Free;
                     end;
                 end;
           end;
 except
   on E: Exception do
Cevapla
#2
iç içe  try end bloğunda nesle  isinleri aynı tutmusun  

if  MlzObj=nil then ile ust bloktaki obje kontrol edilebilir veya nesle ismi degiştirilebilir

if not hatavar then
begin
for/////////
begin end

for //////
begin end;
end else  

yada
function  yapılaçak_islem(paremetreler) booelan; veya dönen değer olabilir objeyi burdada olusturursun  edersin
begin
  for/////    begin  end;
end;

procedure ////////
begin
if not hata then
begin
try
if yapılacak_islem(paremetreler) then
end;
end else begin end;
end;

FreeAndNil( obje ) bu daha iyidir hafızadad yer tutmaz 
hocam aklıma gelen  bu  kolay gelsin
Cevapla
#3
(08-04-2025, Saat: 07:43)metemet Adlı Kullanıcıdan Alıntı: iç içe  try end bloğunda nesle  isinleri aynı tutmusun  

if  MlzObj=nil then ile ust bloktaki obje kontrol edilebilir veya nesle ismi degiştirilebilir

if not hatavar then
begin
for/////////
begin end

for //////
begin end;
end else  

yada
function  yapılaçak_islem(paremetreler) booelan; veya dönen değer olabilir objeyi burdada olusturursun  edersin
begin
  for/////    begin  end;
end;

procedure ////////
begin
if not hata then
begin
try
if yapılacak_islem(paremetreler) then
end;
end else begin end;
end;

 FreeAndNil( obje ) bu daha iyidir hafızadad yer tutmaz 
hocam aklıma gelen  bu  kolay gelsin

Tşk, 

farklı isimle de denedim yine aynı hatayı verdi, fonksiyon yapamam farklı kontroller var. Aşağıdaki şekilde de aynı hatayı verdi, anlamadım.

if MlzObj.TryGetValue('URUN_KODU', JSDeger) then

   try S_MCODE := JSDeger.Value;  except S_MCODE='!'; end;
Cevapla
#4
(08-04-2025, Saat: 09:33)pid=\57442 Adlı Kullanıcıdan Alıntı:
VeriAry   := VeriValue.GetValue<TJSONArray>('items');

if fatura hatayı sorgulamadan önce veriary  tekrar deger atayıp denedinmi  
cünkü try end arasında bende  hata yapmadı
ben delphi 7 kullanıyorum  jonson formatındaki dosyaları  djson unit var ondan okuyorum
fakat  dosya okunurken konum başa gelmiyor sanırsam 
xlm içerisini de de aynı oluyor  
 içte yazdığın try end lere hata mesajı ekle   hata bloguna kendi mesajını yaz
 kolay gelsin
Cevapla
#5
System.JSON bu fonksiyonda patlıyor. İlk geldiğinde doğru sayı geliyor, 2. geldiğinde exception a düşüyor.

function TJSONObject.GetCount: Integer;
begin
Result := FMembers.Count;
end;
Cevapla
#6
Özetle durumu izah etmek gerekirse,

1. Mevcut JSON nesnesine, yine nesnel yaklaşıp
2. Kaynak referansını yeni create ettiğiniz nesneyle atama yaptıktan sonra,
3. Yakınlaştığınız nesneyi FREE ederek sadece ürettiğiniz değil, orjinal kaynağa da zarar verdiğinizden alıyorsunuz.

JSON dallarına erişimde her defasında nesne create etmeye lüzum yok.

aşağıdaki şekilde deneyin göreceksiniz. içeride CREATE FREE vs yok

           // FATURA SATIRLARI Kontrol
         if not FatHataVar then
            begin
              for SatI := 0 to VeriAry.Count-1 do
                  begin
                    MlzObj   := TJSONObject(VeriAry.Items[SatI]);
                    S_MCODE  := MlzObj.FindValue('URUN_KODU').Value;
                  end;
              end;

Ayrıca PARSE ettiğiniz Nesneyi FREE edilmesi lazım.. Unutulmuş sanırım... Aşağıdaki kodu inceleyin.


  try
    VeriObj := TJSONObject.ParseJSONValue(Rrequest.Content) as TJSONObject;
    try
      VeriValue := VeriObj.FindValue('TRANSACTIONS') as TJSONObject;
      VeriAry   := VeriValue.FindValue('items') as TJSONArray;
            // FATURA SATIRLARI Kontrol
           if not FatHataVar then
              begin
                for SatI := 0 to VeriAry.Count-1 do
                    begin
                      MlzObj   := TJSONObject(VeriAry.Items[SatI]);
                      S_MCODE  := MlzObj.FindValue('URUN_KODU').Value;
                      showmessage( S_MCODE );
                    end;
                end;

           // FATURA SATIRLARI Kayıt
           if not FatHataVar then
              begin
                for SatI := 0 to VeriAry.Count-1 do
                    begin
                      MlzObj   := TJSONObject(VeriAry.Items[SatI]);
                      S_MCODE  := MlzObj.FindValue('URUN_KODU').Value;
                      showmessage( S_MCODE );
                    end;
              end;
    finally
      FreeAndNil(VeriObj);
    end;

  except
     on E: Exception do
  end;

Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#7
m_ekiciSystem.JSON bu fonksiyonda patlıyor. İlk geldiğinde doğru sayı geliyor, 2. geldiğinde exception a düşüyor.

function TJSONObject.GetCount: Integer;
begin
 Result := FMembers.Count;
end;

myjonson unit

function myJSON.Count: integer;
begin
if Length(fChild) > 0 then ///  bura kontrol edebilirsin
  result := Length(fChild) else Result:=0;
end;

procedure myJSON.LoadFromFile(filename: string; utf: boolean);
var
  f: Text;
  s, b: string;
begin
 if not FileExists(filename) then begin   Abort end;// ayrıca burdadosya yoksa hataya gitmeden konrol edbilirsin 
  clear_child;
  AssignFile(f, filename);
  {$I-}
...............


cagırdıgımda konrol ediuorum
  if be_jon['ayar'].Count>0 then
Cevapla
#8
Tşk. ederim, farklı bir yolla çözüm bulmuştum.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Anonymous Thread & Exception Tuğrul HELVACI 11 7.864 06-11-2019, Saat: 18:02
Son Yorum: ismailkocacan
  Exception EResNotfoud in modüls hattası(Çözüldü) admin02 7 6.141 13-06-2017, Saat: 19:48
Son Yorum: admin02
  exception BalloonHint kullanımı Dostk 0 1.940 02-02-2017, Saat: 03:35
Son Yorum: Dostk
  raised exception class EInvalidPointer with message 'Invalid pointer operation'. masteryoda 12 12.957 25-10-2016, Saat: 12:53
Son Yorum: barutali



Konuyu Okuyanlar: 1 Ziyaretçi