"Yeni hata atmak" ve "bazı mesajlar atmak" arasındaki fark nedir?


378

Kodun herhangi bir örneğinde özel olarak atılan özel hataları yakalayacak ortak bir hata işleyicisi yazmak istiyorum.

Ben ne zaman throw new Error('sample')aşağıdaki kodu gibi

try {
    throw new Error({'hehe':'haha'});
    // throw new Error('hehe');
} catch(e) {
    alert(e);
    console.log(e);
}

Günlük Firefox'ta olarak gösterilir Error: [object Object]ve nesneyi ayrıştıramadım.

İkincisi throwiçin günlük şu şekilde gösterilir:Error: hehe

Oysa ne zaman yaptım

try {
    throw ({'hehe':'haha'});
} catch(e) {
    alert(e);
    console.log(e);
}

konsol şöyle gösterdi: Object { hehe="haha"}hangi hata özelliklerine erişebildim.

Fark ne?

Fark kodda görüldüğü gibi mi? Gibi dize sadece dize ve nesne olarak nesneler olarak geçirilecek ama sözdizimi farklı olacak?

Hata nesnesi atmayı araştırmadım… Sadece tel atma yapmıştım.

Yukarıda belirtilen iki yöntemden başka bir yol var mı?


6
Yeni Hata ({prop: val}) atmayla ilgili sorun, geçerli bir Hata yapısı değildir. Hatanın Hemant tarafından tartışıldığı gibi bilinen özellikleri vardır.
grantwparks

Yanıtlar:


216

İşte Error nesnesi ve kendi hatalarınızı atma hakkında iyi bir açıklama

Hata Nesnesi

Bir hata durumunda ondan ne çıkarabiliriz? Tüm tarayıcılardaki Error nesnesi aşağıdaki iki özelliği destekler:

  • name: Hatanın adı veya daha spesifik olarak hatanın ait olduğu yapıcı işlevinin adı.

  • message: Hatanın açıklaması, bu açıklama tarayıcıya bağlı olarak değişir.

Belirtildiği gibi hatanın yapıcılarının adlarına karşılık gelen name özelliği tarafından altı olası değer döndürülebilir. Onlar:

Error Name          Description

EvalError           An error in the eval() function has occurred.

RangeError          Out of range number value has occurred.

ReferenceError      An illegal reference has occurred.

SyntaxError         A syntax error within code inside the eval() function has occurred.
                    All other syntax errors are not caught by try/catch/finally, and will
                    trigger the default browser error message associated with the error. 
                    To catch actual syntax errors, you may use the onerror event.

TypeError           An error in the expected variable type has occurred.

URIError            An error when encoding or decoding the URI has occurred 
                   (ie: when calling encodeURI()).

Kendi hatalarınızı atma (istisnalar)

Deneme bloğundan catch bloğuna otomatik olarak aktarılmadan önce 6 tür hatadan birinin gerçekleşmesini beklemek yerine, talep üzerine oluşmaya zorlamak için açıkça kendi istisnalarınızı atabilirsiniz. Bu, bir hatanın ne olduğu ve yakalamak için kontrolün ne zaman aktarılması gerektiği konusunda kendi tanımlarınızı oluşturmak için harikadır.


4
Oh evet. Bu, bu soruyu sormadan önce kaçırdığım iyi bir şey. her neyse, bununla ilgili bilgi arayan kullanıcılar temizlenir. Şimdi neyin ne olduğu konusunda net değilim. :) Teşekkür ederim. birkaç gün içinde oy vermek için döneceğim.
Jayapal Chandran

184
Soruyu henüz en çok cevaplanmış olan cevap bile vermiyor mu?
user9993

@ user9993 Kullanıcı sorulan soru şu anda sohbet başına ayrıntılı bir anlayış arıyordu, bu nedenle buna göre cevap sağlandı ve kullanıcıya yararlı oldu. kabul edilen ve en çok oy alanların sebebi budur.
Hemant Metalia

5
@HemantMetalia Ama haklı, cevap, OP sorusunu belirtildiği gibi cevaplamak için en ufak bir çabayı bile göstermiyor. Eğer sohbette kalması gereken sohbette çok farklı bir cevap cevaplandıysa, burada soru ve cevap mantıklı bir bağlantıya sahip değildir.
Mörre

Ve orijinal soruyu cevaplamak için Javascript için önemli değil. Ancak, Error(ve alt sınıflar) konvansiyon tarafından kullanılır. Ayrıca, varsayılan olarak bir yığın özelliği sağlarlar, ancak bunlar başkalarına elle eklenebilir. Yani bu çoğunlukla konvansiyon, program akışı sizin attığınız şeylerden etkilenmiyor, sadece throwher konuda. Sen olabilir throw "grandmother down the stairs";ve aynı işe bağlı bir yığın izleme ve hata işleme fonksiyonları, gazetecilere, yanlışlık bekliyoruz orada olmayacağını hariç ediyorum Error, ya da daha doğrusu, birlikte gelir özelliklerini.
Mörre

104

"Ben Kötüyüm" atın

throwolacaktır sonlandırmak ayrıca yürütme & mesajı dize maruz catch hata.

try {
  throw "I'm Evil"
  console.log("You'll never reach to me", 123465)
} catch (e) {
  console.log(e); //I'm Evil
}

Sonra konsol atmak fesih nedenini ulaşılabilir asla.


yeni bir hata at ("çok tatlıyım")

throw new Errorİki parametre adı ve iletisi içeren bir hata olayı gösterir . Ayrıca yürütmeyi sonlandırır

try {
  throw new Error("I'm Evil")
  console.log("You'll never reach to me", 123465)
} catch (e) {
  console.log(e.name, e.message); //Error, I'm Evil
}


16
"Atma Hatası ('ne olursa olsun") "ve" yeni Hata (' ne olursa olsun ') "arasındaki fark nedir?
joedotnot

9
Hata işlevsel, yeni Hata yapıcıdır. her ikisi de aynı geliştirici
mozilla.org/tr-TR/docs/Web/JavaScript/Reference/…

5
@NishchitDhanani Böyle anlaşılmaz ve yanlış bir yorumun oy almasını garip buluyorum. Hem "Hata işlevseldir" ne de "yeni Hata yapıcıdır" anlamsızdır ve / veya yanlıştır. Bu bağlamda bağlantının tam olarak neyi “kanıtlaması” gerektiği açıktır. MDN sayfası Error, tamam, yorumun bağlantısı nerede? OP sorusunu yorumlayan ve cevaplayan insanların yarısı sessiz kalmalıydı.
Mörre

@ Mörre Bu bölümden bu bölüme bakın Used as a function... developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Nishchit Dhanani

Tamam anladım. Bu bir işlev .
Nishchit Dhanani

73

Aşağıdaki makale, belki de daha iyi bir seçim olduğu konusunda biraz daha ayrıntılıdır; throw 'An error'veya throw new Error('An error'):

http://www.nczonline.net/blog/2009/03/10/the-art-of-throwing-javascript-errors-part-2/

new Error()Internet Explorer ve Safari (sürümlerden emin olmayan) gibi tarayıcılar, ilkini kullanırken mesajı doğru bir şekilde bildirmediğinden , ikincisinin ( ) daha güvenilir olduğunu önerir .

Aksi takdirde bir hata atılır, ancak tüm tarayıcılar beklediğiniz şekilde yanıt vermez. Firefox, Opera ve Chrome'un her biri bir "yakalanmayan istisna" mesajı görüntüler ve ardından mesaj dizesini içerir. Safari ve Internet Explorer “yakalanmayan bir istisna” hatası veriyor ve ileti dizesini hiç vermiyor. Açıkçası, bu hata ayıklama açısından yetersizdir.


36

İlk önce bu koddan bahsedersiniz:

throw new Error('sample')

ve ilk örneğinizde şunu yazın:

throw new Error({'hehe':'haha'}) 

İlk Error nesnesi aslında çalışır, çünkü bir dize değeri bekler, bu durumda 'sample'. İkincisi, bir nesneyi içeri aktarmaya çalıştığınız için değildir ve bir dize beklemektedir.

Hata nesnesi "örnek" olacak "mesaj" özelliğine sahip olacaktır.


12
İkincisi işe yarıyor, çok yararlı bir şekilde değil. Bu toString()yöntem iletilen nesne üzerinde yürütülür ve [object Object]hataya neden olur (Op'un yazdığı gibi).
cjn


15

thrownesne olarak yapabilirsin

throw ({message: 'This Failed'})

o zaman örneğin try/catch

try {
//
} catch(e) {
    console.log(e); //{message: 'This Failed'}
    console.log(e.message); //This Failed
}

veya sadece bir dize hatası atın

throw ('Your error')

try {
//
} catch(e) {
    console.log(e); //Your error
}

throw new Error //only accept a string

15

ErrorYapıcı bir hata nesne oluşturmak için kullanılır. Çalışma zamanı hataları oluştuğunda hata nesneleri atılır. Error nesnesi, kullanıcı tanımlı özel durumlar için temel nesne olarak da kullanılabilir.

Kullanıcı tanımlı Hatalar throwifade yoluyla atılır . program kontrolü catchçağrı yığınındaki ilk bloğa geçirilecektir .

Error nesnesi olan ve olmayan bir hata atma arasındaki fark:


throw {'hehe':'haha'};

Krom cihazlarında şuna benzer:

resim açıklamasını buraya girin

Chrome bize, yalnızca bir JS nesnesi olan yakalanmamış bir hatamız olduğunu söylüyor. Nesnenin kendisi hata hakkında bilgi sahibi olabilir, ancak nereden geldiğini hemen bilmiyoruz. Kodumuz üzerinde çalışırken ve hata ayıklama yaparken çok kullanışlı değil.


throw new Error({'hehe':'haha'}); 

Krom cihazlarında şuna benzer:

resim açıklamasını buraya girin

Error nesnesiyle atılan bir hata, onu genişlettiğimizde bize bir yığın izlemesi verir. Bu, hatanın tam olarak nereden geldiğini değerli bilgiler verir; bu, kodunuzda hata ayıklarken genellikle değerli bilgilerdir. Ayrıca hata diyor ki [object Object], bunun nedeni Erroryapıcı bir ileti dizesini ilk argüman olarak beklemesidir. Bir nesne aldığında, onu bir dizeye zorlar.


2

Reaksiyon davranışı

Yanıtların geri kalanından ayrı olarak, React'ta bir fark göstermek istiyorum.

Bir atarsam new Error()ve geliştirme modundayım, bir hata ekranı ve konsol günlüğü alırım. Bir dizgi hazır bilgisi atarsam, yalnızca konsolda göreceğim ve konsol günlüğünü izlemiyorsam muhtemelen özleyeceğim.

Misal

Bir hata atmak konsolda oturum açar ve geliştirme modunda bir hata ekranı gösterir (ekran üretimde görünmez).

throw new Error("The application could not authenticate.");

Reaksiyondaki hata ekranı

Aşağıdaki kod yalnızca konsolda oturum açarken:

throw "The application could not authenticate.";
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.