aboutsummaryrefslogtreecommitdiff
path: root/files/pt-br/web/javascript/reference/statements/throw/index.html
blob: e8835f8d85bea49ac5b1f8ec98983f6ccd6dc68b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
---
title: throw
slug: Web/JavaScript/Reference/Statements/throw
tags:
  - Instrução
  - JavaScript
translation_of: Web/JavaScript/Reference/Statements/throw
---
<div>{{jsSidebar("Statements")}}</div>

<p>A <strong>declaração</strong> <strong><code>throw</code> </strong>lança uma exceção definida pelo usuário. A execução da função atual vai parar (as instruções após o <code>throw</code> não serão executadas), e o controle será passado para o primeiro bloco <a href="/en-US/docs/Web/JavaScript/Reference/Statements/try...catch"><code>catch</code></a> na pilha de chamadas. Se nenhum bloco <code>catch</code> existe entre as funções "chamadoras", o programa vai terminar.</p>

<h2 id="Sintaxe">Sintaxe</h2>

<pre class="syntaxbox">throw <em>expressão</em>; </pre>

<dl>
 <dt><code>expressão</code></dt>
 <dd>A expressão a ser lançada.</dd>
</dl>

<h2 id="Descrição">Descrição</h2>

<p>Use a instrução <code>throw</code> para lançar uma exceção. Quando você lança uma exceção, <code>expressão</code> especifica o valor da exceção. Cada uma das intruções a seguir lança uma exceção:</p>

<pre class="brush: js">throw "Erro2"; // gera uma exceção com um valor string
throw 42;      // gera uma exceção com o valor 42
throw true;    // gera uma exceção com o valor true</pre>

<p>Note também que a instrução <code>throw</code> é afetada pela <a href="/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#Automatic_semicolon_insertion">inserção automática de ponto-e-vírgula (ASI)</a> como nenhum terminador de linha entre a palavra <code>throw</code> e a expressão é permitido.</p>

<h2 id="Exemplos">Exemplos</h2>

<h3 id="Lançando_um_objeto">Lançando um objeto</h3>

<p>Você pode especificar um objeto quando você lança uma exceção. Você pode então referenciar as propriedades do objeto no bloco <code>catch</code>. O exemplo a seguir cria um objeto do tipo <code>UserException</code> e o usa na intrução <code>throw</code>.</p>

<pre class="brush: js">function UserException(message) {
   this.message = message;
   this.name = "UserException";
}
function getMonthName(mo) {
   mo = mo-1; // Ajusta o número do mês para index de array (1=Jan, 12=Dec)
   var months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul",
      "Aug", "Sep", "Oct", "Nov", "Dec"];
   if (months[mo] !== undefined) {
      return months[mo];
   } else {
      throw new UserException("InvalidMonthNo");
   }
}

try {
   // statements to try
   var myMonth = 15; // 15 is out of bound to raise the exception
   monthName = getMonthName(myMonth);
} catch (e) {
   monthName = "unknown";
   logMyErrors(e.message, e.name); // pass exception object to err handler
}
</pre>

<h3 id="Outro_exemplo_lançando_um_objeto">Outro exemplo lançando um objeto</h3>

<p>O exemplo a seguir testa uma string de entrada para um cep dos Estados Unidos. Se o CEP utiliza um formato inválido, a intrução throw lança uma exceção através da criação de um objeto do tipo <code>ZipCodeFormatException</code>.</p>

<pre class="brush: js">/*
 * Cria um objeto ZipCode.
 *
 * Formatos aceitos para o CEP são:
 *    12345
 *    12345-6789
 *    123456789
 *    12345 6789
 *
 * Se o argumento passado para o construtor do ZipCode não atende
 * a um desses padrões uma exceção é lançada.
 */

function ZipCode(zip) {
   zip = new String(zip);
   pattern = /[0-9]{5}([- ]?[0-9]{4})?/;
   if (pattern.test(zip)) {
      // o valor do CEP será a primeira combinação na string
      this.value = zip.match(pattern)[0];
      this.valueOf = function() {
         return this.value
      };
      this.toString = function() {
         return String(this.value)
      };
   } else {
      throw new ZipCodeFormatException(zip);
   }
}

function ZipCodeFormatException(value) {
   this.value = value;
   this.message = "does not conform to the expected format for a zip code";
   this.toString = function() {
      return this.value + this.message;
   };
}

/*
 * Isso poderia estar em um script que valida dados de endereços
 * para os endereços dos Estados Unidos.
 */

const ZIPCODE_INVALID = -1;
const ZIPCODE_UNKNOWN_ERROR = -2;

function verifyZipCode(z) {
   try {
      z = new ZipCode(z);
   } catch (e) {
      if (e instanceof ZipCodeFormatException) {
         return ZIPCODE_INVALID;
      } else {
         return ZIPCODE_UNKNOWN_ERROR;
      }
   }
   return z;
}

a = verifyZipCode(95060);         // retorna 95060
b = verifyZipCode(9560);          // retorna -1
c = verifyZipCode("a");           // retorna -1
d = verifyZipCode("95060");       // retorna 95060
e = verifyZipCode("95060 1234");  // retorna 95060 1234
</pre>

<h3 id="Relançando_uma_exceção">Relançando uma exceção</h3>

<p>Você pode usar <code>throw</code> para relançar uma exceção após você pegá-la. O exemplo a seguir pega uma exceção com um valor numérico e a relança se o valor for maior que 50. A exceção relançada propaga para a função encapsuladora ou para o nível superior para que o usuário a veja.</p>

<pre class="brush: js">try {
   throw n; // lança uma exceção com um valor numérico
} catch (e) {
   if (e &lt;= 50) {
      // instruções para tratar exceções 1-50
   } else {
      // não pode tratar esta exceção então relança
      throw e;
   }
}
</pre>

<h2 id="Specifications">Specifications</h2>

<table class="standard-table">
 <tbody>
  <tr>
   <th scope="col">Specification</th>
   <th scope="col">Status</th>
   <th scope="col">Comment</th>
  </tr>
  <tr>
   <td>{{SpecName('ES3')}}</td>
   <td>{{Spec2('ES3')}}</td>
   <td>Definição inicial. Implementada no JavaScript 1.4</td>
  </tr>
  <tr>
   <td>{{SpecName('ES5.1', '#sec-12.13', 'throw statement')}}</td>
   <td>{{Spec2('ES5.1')}}</td>
   <td> </td>
  </tr>
  <tr>
   <td>{{SpecName('ES6', '#sec-throw-statement', 'throw statement')}}</td>
   <td>{{Spec2('ES6')}}</td>
   <td> </td>
  </tr>
  <tr>
   <td>{{SpecName('ESDraft', '#sec-throw-statement', 'throw statement')}}</td>
   <td>{{Spec2('ESDraft')}}</td>
   <td> </td>
  </tr>
 </tbody>
</table>

<h2 id="Compatibilidade_de_browser">Compatibilidade de browser</h2>

<p>{{CompatibilityTable}}</p>

<div id="compat-desktop">
<table class="compat-table">
 <tbody>
  <tr>
   <th>Funcionalidade</th>
   <th>Chrome</th>
   <th>Firefox (Gecko)</th>
   <th>Internet Explorer</th>
   <th>Opera</th>
   <th>Safari</th>
  </tr>
  <tr>
   <td>Basic support</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
  </tr>
 </tbody>
</table>
</div>

<div id="compat-mobile">
<table class="compat-table">
 <tbody>
  <tr>
   <th>Funcionalidade</th>
   <th>Android</th>
   <th>Chrome para Android</th>
   <th>Firefox Mobile (Gecko)</th>
   <th>IE Mobile</th>
   <th>Opera Mobile</th>
   <th>Safari Mobile</th>
  </tr>
  <tr>
   <td>Basic support</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
  </tr>
 </tbody>
</table>
</div>

<h2 id="Veja_também">Veja também</h2>

<ul>
 <li><a href="/en-US/docs/Web/JavaScript/Reference/Statements/try...catch"><code>try...catch</code></a></li>
</ul>