Autor Zpráva
Měsíček
Profil
Zdravím,

natrefil jsem na jednu zvláštnost a to u tohoto kódu.

<script type="text/javascript">
  var pomocna_promenna  = true;
  var pomocna_promenna2 = 1;
    try {
      if(pomocna_promenna2 == 1){
        throw "Chyba_1";
      }
    } catch (e if (pomocna_promenna == true)) {
      if( e == "Chyba_1" ){
        alert("Něco je zjevně špatně!");
      }
    } finally {
      alert("No nic ...");
    }
</script>
Celý tento skript funguje v FF tak jak by měl fungovat ovšem v IE se nestane nic, jestliže ovšem oddělám označenou část funguje celý skript i v IE, ale to pak zase nemá účinek takový jaký jsem v prvopočátku plánoval. Není nějáká jiná možnost, aby příkaz catch() chytal výjmky závisle na tom jestli mu to v jiné proměnné povolím či ne?

Již dopředu děkuji za odpovědi.
Chamurappi
Profil
Reaguji na Měsíčka:
Celý tento skript funguje v FF tak jak by měl fungovat
Zdá se, že funguje pouze v něm. Abych pravdu řekl, tak catch s podmínkou vidím poprvé v životě.

Není nějáká jiná možnost, aby příkaz catch() chytal výjmky závisle
Zvolit jinak strukturu skriptu, podmínku dát dovnitř atd. — musí to jít přešrouborat.

Nejsem zrovna přívržencem hrátek s výjimkami (v JavaScriptu), try–catch používám jen z donucení okolnostmi. Příkaz throw jsem nepoužil nikdy. Nejde to, čeho chceš dosáhnout, udělat úplně bez výjimek?
Měsíček
Profil
"Nejde to, čeho chceš dosáhnout, udělat úplně bez výjimek?"

Určitě jde, ale rád bych měl u těchto příkazů jasno - proto v tom hledám špinavá zákoutí.

"Zvolit jinak strukturu skriptu, podmínku dát dovnitř atd. — musí to jít přešrouborat. "

Nejspíše asi ano :( .. pokud nechci IE odříznout tak budu nejspíše muset dát catch() do podmínky celý a nebo vložit podmínku před podmínku která mi kontroluje jestli se objekt e rovná "Chybě_1", jen mě mrzí, že zrovna v tak jednoduché konstrukci se musí podpora v prohlížečích rozcházet.

Jinak díky za reakci.
joe
Profil
nejspíše muset dát catch() do podmínky celý a nebo vložit podmínku před podmínku
Spíš tu druhou možnost, teď si nejsem jistý, jestli bys mohl přerušit - překřížit try-cacth-finally.

} catch (e) {
      if( e == "Chyba_1" && pomocna_promenna == true){
        alert("Něco je zjevně špatně!");
      }
}


V catch jsem nikdy podmínku neviděl a nevím k čemu by tam byla užitečná...
ah01
Profil
Měsíček
try ... catch s podmínkou funguje jen ve FF. Přidali to v jedné vyšší verzi JS, takže v IE to fungovat nebude. Jak jsou na tom ostatní prohlížeče, jsem už dál nezkoumal. Je to asi 3 měsíce co jsem po tom pátral, ale obávám se, že situace se od té doby nezměnila.

joe
Využívá se to pro detekci typu výjimky, podobně jako to jde například v Jave. Koukni se na příklady na stránce, na kterou odkazuje Chamurappi.

Já jsem to tehdy nakonec řešil asi takto:
...
catch(e)
{
  if(!(e instanceof XMLReader.XMLElementNotFound))
    throw e; // nejedná se o výjimku od XMLReader, poslat o dům dál
    
  // obsluha výjimky
}
...


Měsíček
Osobně si myslím, že by se tato catch podmínka měla používat pouze k detekci typu výjimky nebo k zjištění informací přímo z výjimky (proměnné e) a ne k testování jiné proměnné. To už podle mě patří dovnitř catch bloku.
peta
Profil
nejake priklady na try catch
http://javascript-reference.info/#error
http://www.volny.cz/peter.mlich/www.htm#main3

co rika primo mozilla (pro CH google.com mozilla catch)
http://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Exception_Ha ndling_Statements/try...catch_Statement

tak mozilla tam treba ma primo
try {
// function could throw three exceptions
getCustInfo("Lee", 1234, "lee@netscape.com")
}

catch (e if e == "InvalidNameException") {
// call handler for invalid names
bad_name_handler(e)
}
catch (e if e == "InvalidIdException") {
// call handler for invalid ids
bad_id_handler(e)
}

A co na to explorer? (pro CH google.com catch site:msdn.microsoft.com)
http://msdn.microsoft.com/en-us/library/4yahc5d8(VS.85).aspx
IE nam rika
try {
try {
if (x == 0) // Evalute argument.
throw "x equals zero"; // Throw an error.
else
throw "x does not equal zero"; // Throw a different error.
}
catch(e) { // Handle "x = 0" errors here.
if (e == "x equals zero") // Check for an error handled here.
return(e + " handled locally."); // Return object error message.
else // Can't handle error here.
throw e; // Rethrow the error for next
} // error handler.
}
catch(e) { // Handle other errors here.
return(e + " handled higher up."); // Return error message.
}


Cili, ze to v IE asi nepujde tak napsat, kdyz neuvadi priklad.
peta
Profil
Cili bych to prepsal, jak uvadi joe nebo IE
catch(e)
{
if (...) {...}
if (...) {...}
}
Měsíček
Profil
Reaguji na joea:

"V catch jsem nikdy podmínku neviděl a nevím k čemu by tam byla užitečná..."
No tak například když chceš, aby chytání "všech" výjmek záviselo na nějáké hodnotě, pokud se dá podmínka až do podmínky, která odchytne určitou chybu je to otázka pouze odchycení "jedné" výjmky, ne všech.

Reaguji na ah01:

"Osobně si myslím, že by se tato catch podmínka měla používat pouze k detekci typu výjimky nebo k zjištění informací přímo z výjimky (proměnné e) a ne k testování jiné proměnné. To už podle mě patří dovnitř catch bloku."

Taky se tím asi už budu řídit.

"takže v IE to fungovat nebude."

Snad by to mohli dodělat v IE8.

Reaguji na peteho:

Co se týče reference na developer.mozilla.org tak tu jsem si četl (pravda podívat se na MSDN to mě nenapadlo) - žel ještě nejsem tak zběhlý, abych vše bezpečně pochopil :)
es
Profil *
Niečo k tomu v češtine: http://developer.mozilla.org/cs/JavaScript_v_Mozille/V%C3%BDjimky

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0