File Coverage

blib/lib/MongoDB/Error.pm
Criterion Covered Total %
statement 206 266 77.4
branch 3 52 5.7
condition 0 9 0.0
subroutine 70 91 76.9
pod 0 3 0.0
total 279 421 66.2


line stmt bran cond sub pod time code
1             # Copyright 2014 - present MongoDB, Inc.
2             #
3             # Licensed under the Apache License, Version 2.0 (the "License");
4             # you may not use this file except in compliance with the License.
5             # You may obtain a copy of the License at
6             #
7             # http://www.apache.org/licenses/LICENSE-2.0
8             #
9             # Unless required by applicable law or agreed to in writing, software
10             # distributed under the License is distributed on an "AS IS" BASIS,
11             # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12             # See the License for the specific language governing permissions and
13             # limitations under the License.
14              
15 70     70   500892 use strict;
  70         219  
  70         1765  
16 70     70   300 use warnings;
  70         112  
  70         2038  
17              
18             package MongoDB::Error;
19              
20             # ABSTRACT: MongoDB Driver Error classes
21              
22             # Portions adapted from Throwable.pm by Ricardo Signes
23              
24 70     70   2488 use version;
  70         9654  
  70         318  
25              
26             our $VERSION = 'v2.2.2';
27              
28 70     70   7829 use Moo;
  70         63829  
  70         542  
29 70     70   26677 use Carp;
  70         166  
  70         4002  
30 70         1738 use MongoDB::_Types qw(
31             ErrorStr
32 70     70   24978 );
  70         242  
33 70         407 use Types::Standard qw(
34             ArrayRef
35             Str
36 70     70   73762 );
  70         139  
37 70     70   49978 use Scalar::Util ();
  70         139  
  70         909  
38 70     70   29235 use Sub::Quote ();
  70         290060  
  70         1637  
39 70     70   24440 use Safe::Isa;
  70         36092  
  70         9049  
40 70     70   642 use Exporter 5.57 qw/import/;
  70         902  
  70         2174  
41 70     70   28704 use namespace::clean -except => ['import'];
  70         617469  
  70         1579  
42              
43             my $ERROR_CODES;
44              
45             BEGIN {
46 70     70   28804 $ERROR_CODES = {
47             BAD_VALUE => 2,
48             HOST_UNREACHABLE => 6,
49             HOST_NOT_FOUND => 7,
50             UNKNOWN_ERROR => 8,
51             USER_NOT_FOUND => 11,
52             ILLEGAL_OPERATION => 20,
53             NAMESPACE_NOT_FOUND => 26,
54             INDEX_NOT_FOUND => 27,
55             CURSOR_NOT_FOUND => 43,
56             EXCEEDED_TIME_LIMIT => 50,
57             COMMAND_NOT_FOUND => 59,
58             WRITE_CONCERN_ERROR => 64,
59             NETWORK_TIMEOUT => 89,
60             SHUTDOWN_IN_PROGRESS => 91,
61             PRIMARY_STEPPED_DOWN => 189,
62             SOCKET_EXCEPTION => 9001,
63             NOT_MASTER => 10107,
64             DUPLICATE_KEY => 11000,
65             DUPLICATE_KEY_UPDATE => 11001, # legacy before 2.6
66             INTERRUPTED_AT_SHUTDOWN => 11600,
67             INTERRUPTED_DUE_TO_REPL_STATE_CHANGE => 11602,
68             DUPLICATE_KEY_CAPPED => 12582, # legacy before 2.6
69             UNRECOGNIZED_COMMAND => 13390, # mongos error before 2.4
70             NOT_MASTER_NO_SLAVE_OK => 13435,
71             NOT_MASTER_OR_SECONDARY => 13436,
72             CANT_OPEN_DB_IN_READ_LOCK => 15927,
73             };
74             }
75              
76 70     70   521 use constant $ERROR_CODES;
  70         142  
  70         19104  
77              
78             # Export error codes for use by end-users; this is unusual for Moo, but
79             # probably sufficiently helpful to justify it
80             our @EXPORT = keys %$ERROR_CODES;
81              
82             our %_HORRIBLE_HACK;
83              
84             use overload (
85             q{""} => sub {
86 739     739   12508 my $self = shift;
87 739         5074 return sprintf( "%s: %s", ref($self), $self->message );
88             },
89 70         838 fallback => 1
90 70     70   478 );
  70         185  
91              
92             has message => (
93             is => 'ro',
94             isa => ErrorStr,
95             default => 'unspecified error',
96             );
97              
98             has 'previous_exception' => (
99             is => 'ro',
100             default => Sub::Quote::quote_sub(q<
101             if (defined $MongoDB::Error::_HORRIBLE_HACK{ERROR}) {
102             $MongoDB::Error::_HORRIBLE_HACK{ERROR}
103             } elsif (defined $@ and (ref $@ or length $@)) {
104             $@;
105             } else {
106             undef;
107             }
108             >),
109             );
110              
111             has error_labels => (
112             is => 'ro',
113             isa => ArrayRef[Str],
114             default => sub { [] },
115             );
116              
117             sub has_error_label {
118 0     0 0 0 my ( $self, $expected ) = @_;
119              
120 0 0       0 return unless defined $self->error_labels;
121 0         0 return grep { $_ eq $expected } @{ $self->error_labels };
  0         0  
  0         0  
122             }
123              
124             sub add_error_label {
125 0     0 0 0 my ( $self, $label ) = @_;
126              
127 0 0       0 return if $self->has_error_label( $label );
128 0         0 push @{ $self->error_labels }, $label;
  0         0  
129             }
130              
131             sub throw {
132 300     300 0 8330 my ($inv) = shift;
133              
134 300 50       1310 if (Scalar::Util::blessed($inv)) {
135 0 0       0 Carp::confess "throw called on MongoDB::Error object with arguments" if @_;
136 0         0 die $inv;
137             }
138              
139 300         1095 local $_HORRIBLE_HACK{ERROR} = $@;
140              
141 300 100       6601 my $throwable = @_ == 1 ? $inv->new( message => $_[0] ) : $inv->new(@_);
142              
143 300         26504 die $throwable;
144             }
145              
146             # internal flag indicating if an operation should be retried when
147             # an error occurs.
148 0     0   0 sub _is_resumable { 1 }
149              
150             # internal flag for if this error type specifically can be retried regardless
151             # of other state. See _is_retryable which contains the full retryable error
152             # logic.
153 0     0   0 sub __is_retryable_error { 0 }
154              
155             my @retryable_codes = (
156             MongoDB::Error::HOST_NOT_FOUND(),
157             MongoDB::Error::HOST_UNREACHABLE(),
158             MongoDB::Error::NETWORK_TIMEOUT(),
159             MongoDB::Error::SHUTDOWN_IN_PROGRESS(),
160             MongoDB::Error::PRIMARY_STEPPED_DOWN(),
161             MongoDB::Error::SOCKET_EXCEPTION(),
162             MongoDB::Error::NOT_MASTER(),
163             MongoDB::Error::INTERRUPTED_AT_SHUTDOWN(),
164             MongoDB::Error::INTERRUPTED_DUE_TO_REPL_STATE_CHANGE(),
165             MongoDB::Error::NOT_MASTER_NO_SLAVE_OK(),
166             MongoDB::Error::NOT_MASTER_OR_SECONDARY(),
167             );
168              
169             sub _check_is_retryable_code {
170 0     0   0 my $code = $_[-1];
171              
172 0 0       0 return 1 if grep { $code == $_ } @retryable_codes;
  0         0  
173 0         0 return 0;
174             }
175              
176             sub _check_is_retryable_message {
177 0     0   0 my $message = $_[-1];
178              
179 0 0       0 return 0 unless defined $message;
180 0 0       0 return 1 if $message =~ /(not master|node is recovering)/i;
181 0         0 return 0;
182             }
183              
184             # indicates if this error can be retried under retryable writes
185             sub _is_retryable {
186 0     0   0 my $self = shift;
187              
188 0 0       0 if ( $self->$_can( 'result' ) ) {
189 0 0       0 return 1 if _check_is_retryable_code( $self->result->last_code );
190             }
191              
192 0 0       0 if ( $self->$_can( 'code' ) ) {
193 0 0       0 return 1 if _check_is_retryable_code( $self->code );
194             }
195              
196 0 0       0 return 1 if _check_is_retryable_message( $self->message );
197              
198 0 0 0     0 if ( $self->$_isa( 'MongoDB::WriteConcernError' ) && $self->result->$_can( 'output' ) ) {
199 0 0       0 return 1 if _check_is_retryable_code( $self->result->output->{writeConcernError}{code} );
200 0 0       0 return 1 if _check_is_retryable_message( $self->result->output->{writeConcernError}{message} );
201             }
202              
203             # Defaults to 0 unless its a network exception
204 0         0 return $self->__is_retryable_error;
205             }
206              
207             my @unknown_commit_codes = (
208             MongoDB::Error::EXCEEDED_TIME_LIMIT(),
209             MongoDB::Error::WRITE_CONCERN_ERROR(),
210             );
211              
212             sub _check_is_unknown_commit_code {
213 0     0   0 my $code = $_[-1];
214              
215 0 0       0 return 1 if grep { $code == $_ } @unknown_commit_codes;
  0         0  
216 0         0 return 0;
217             }
218              
219             sub _is_unknown_commit_error {
220 0     0   0 my $self = shift;
221              
222 0 0 0     0 return 1 if $self->isa("MongoDB::ConnectionError") || $self->isa("MongoDB::SelectionError");
223              
224 0 0       0 return 1 if $self->_is_retryable;
225              
226 0 0       0 if ( $self->$_can( 'result' ) ) {
227 0 0       0 return 1 if _check_is_unknown_commit_code( $self->result->last_code );
228             }
229              
230 0 0       0 if ( $self->$_can( 'code' ) ) {
231 0 0       0 return 1 if _check_is_unknown_commit_code( $self->code );
232             }
233              
234 0         0 return 0;
235             }
236              
237             sub _is_transient_transaction_error {
238 0     0   0 my $self = shift;
239 0 0 0     0 return 1 if $self->isa("MongoDB::ConnectionError") || $self->isa("MongoDB::SelectionError");
240 0         0 return 0;
241             }
242              
243             # Look for error code ILLEGAL_OPERATION and starts with "Transaction numbers"
244             sub _is_storage_engine_not_retryable {
245 0     0   0 my $self = shift;
246 0 0       0 if ( $self->$_can( 'code' ) ) {
247 0 0       0 return 0 if $self->code != MongoDB::Error::ILLEGAL_OPERATION;
248             }
249 0         0 return index($self->message, "Transaction numbers", 0) == 0;
250             }
251              
252             #--------------------------------------------------------------------------#
253             # Subclasses with attributes included inline below
254             #--------------------------------------------------------------------------#
255              
256             package MongoDB::DatabaseError;
257 70     70   68725 use Moo;
  70         146  
  70         1743  
258 70         602 use MongoDB::_Types qw(
259             Numish
260 70     70   24581 );
  70         153  
261 70     70   80840 use namespace::clean;
  70         124  
  70         268  
262              
263             extends("MongoDB::Error");
264              
265             has result => (
266             is => 'ro',
267             does => 'MongoDB::Role::_DatabaseErrorThrower',
268             required => 1,
269             );
270              
271             has code => (
272             is => 'ro',
273             isa => Numish,
274             builder => '_build_code',
275             );
276              
277 1     1   5075 sub _build_code { return MongoDB::Error::UNKNOWN_ERROR() }
278              
279 0     0     sub _is_resumable { 0 }
280              
281             package MongoDB::DocumentError;
282              
283 70     70   20121 use Moo;
  70         130  
  70         252  
284 70     70   18321 use Types::Standard qw(Any);
  70         139  
  70         1710  
285 70     70   44247 use namespace::clean;
  70         166  
  70         234  
286              
287             extends("MongoDB::Error");
288              
289             has document => (
290             is => 'ro',
291             isa => Any,
292             required => 1,
293             );
294              
295             package MongoDB::UsageError;
296              
297 70     70   16203 use Moo;
  70         163  
  70         243  
298 70     70   17356 use Types::Standard qw(Str);
  70         121  
  70         288  
299 70     70   27781 use namespace::clean -except => 'meta';
  70         127  
  70         678  
300              
301             extends("MongoDB::Error");
302              
303             use overload (
304             q{""} => sub {
305 35     35   3420 my $self = shift;
306 35         607 return sprintf( "%s: %s%s", ref($self), $self->message, $self->trace );
307             },
308 70         410 fallback => 1
309 70     70   17744 );
  70         127  
310              
311             has trace => (
312             is => 'ro',
313             isa => Str,
314             );
315              
316             around BUILDARGS => sub {
317             my $orig = shift;
318             my $class = shift;
319             my $args = $class->SUPER::BUILDARGS(@_);
320             # start stack trace above where throw() is called (or
321             # at the top of the stack), so it works like confess
322             my $i = 0;
323             while ( my @caller = caller($i) ) {
324             $i++;
325             last if $caller[0] eq "MongoDB::Error";
326             }
327             local $Carp::CarpLevel = caller( $i + 1 ) ? $i + 1 : $i;
328             $args->{trace} = Carp::longmess('');
329             return $args;
330             };
331              
332             # Connection errors
333             package MongoDB::ConnectionError;
334 70     70   14069 use Moo;
  70         127  
  70         347  
335 70     70   16397 use namespace::clean;
  70         204  
  70         244  
336             extends 'MongoDB::Error';
337              
338 0     0     sub _is_resumable { 1 }
339 0     0     sub __is_retryable_error { 1 }
340              
341             package MongoDB::HandshakeError;
342 70     70   15709 use Moo;
  70         132  
  70         544  
343 70     70   18126 use namespace::clean;
  70         189  
  70         286  
344             extends 'MongoDB::ConnectionError';
345              
346             package MongoDB::NetworkError;
347 70     70   17590 use Moo;
  70         143  
  70         308  
348 70     70   18893 use namespace::clean;
  70         143  
  70         272  
349             extends 'MongoDB::ConnectionError';
350              
351             # Timeout errors
352             package MongoDB::TimeoutError;
353 70     70   15916 use Moo;
  70         189  
  70         276  
354 70     70   18166 use namespace::clean;
  70         157  
  70         271  
355             extends 'MongoDB::Error';
356              
357 0     0     sub __is_retryable_error { 1 }
358              
359             package MongoDB::ExecutionTimeout;
360 70     70   17167 use Moo;
  70         160  
  70         273  
361 70     70   22164 use namespace::clean;
  70         150  
  70         364  
362             extends 'MongoDB::TimeoutError';
363              
364             package MongoDB::NetworkTimeout;
365 70     70   14891 use Moo;
  70         139  
  70         1459  
366 70     70   20970 use namespace::clean;
  70         121  
  70         1421  
367             extends 'MongoDB::TimeoutError';
368              
369             # Database errors
370             package MongoDB::DuplicateKeyError;
371 70     70   15072 use Moo;
  70         135  
  70         1415  
372 70     70   20394 use namespace::clean;
  70         160  
  70         228  
373             extends 'MongoDB::DatabaseError';
374 0     0     sub _build_code { return MongoDB::Error::DUPLICATE_KEY() }
375              
376             package MongoDB::NotMasterError;
377 70     70   16030 use Moo;
  70         126  
  70         1524  
378 70     70   17822 use namespace::clean;
  70         140  
  70         264  
379             extends 'MongoDB::DatabaseError';
380 0     0     sub _build_code { return MongoDB::Error::NOT_MASTER() }
381 0     0     sub _is_resumable { 1 }
382              
383             package MongoDB::WriteError;
384 70     70   16797 use Moo;
  70         327  
  70         269  
385 70     70   28995 use namespace::clean;
  70         139  
  70         255  
386             extends 'MongoDB::DatabaseError';
387              
388             package MongoDB::WriteConcernError;
389 70     70   14761 use Moo;
  70         128  
  70         309  
390 70     70   19251 use namespace::clean;
  70         143  
  70         297  
391             extends 'MongoDB::DatabaseError';
392 0     0     sub _build_code { return MongoDB::Error::WRITE_CONCERN_ERROR() }
393              
394             # Other errors
395             package MongoDB::AuthError;
396 70     70   16484 use Moo;
  70         138  
  70         270  
397 70     70   18268 use namespace::clean;
  70         155  
  70         268  
398             extends 'MongoDB::Error';
399              
400             package MongoDB::ConfigurationError;
401 70     70   15045 use Moo;
  70         139  
  70         282  
402 70     70   17992 use namespace::clean;
  70         172  
  70         261  
403             extends 'MongoDB::Error';
404              
405             package MongoDB::CursorNotFoundError;
406 70     70   16287 use Moo;
  70         135  
  70         240  
407 70     70   18018 use namespace::clean;
  70         168  
  70         314  
408             extends 'MongoDB::DatabaseError';
409 0     0     sub _build_code { return MongoDB::Error::CURSOR_NOT_FOUND() }
410 0     0     sub _is_resumable { 1 }
411              
412             package MongoDB::DecodingError;
413 70     70   18536 use Moo;
  70         148  
  70         329  
414 70     70   17801 use namespace::clean;
  70         123  
  70         1517  
415             extends 'MongoDB::Error';
416              
417             package MongoDB::GridFSError;
418 70     70   15482 use Moo;
  70         145  
  70         233  
419 70     70   18480 use namespace::clean;
  70         124  
  70         293  
420             extends 'MongoDB::Error';
421              
422             package MongoDB::InternalError;
423 70     70   19117 use Moo;
  70         143  
  70         308  
424 70     70   19713 use namespace::clean;
  70         142  
  70         256  
425             extends 'MongoDB::Error';
426              
427             package MongoDB::ProtocolError;
428 70     70   16655 use Moo;
  70         165  
  70         382  
429 70     70   18113 use namespace::clean;
  70         1386  
  70         1424  
430             extends 'MongoDB::Error';
431              
432             package MongoDB::SelectionError;
433 70     70   15988 use Moo;
  70         1247  
  70         293  
434 70     70   19367 use namespace::clean;
  70         150  
  70         260  
435             extends 'MongoDB::Error';
436              
437             package MongoDB::InvalidOperationError;
438 70     70   15811 use Moo;
  70         159  
  70         4001  
439 70     70   20337 use namespace::clean;
  70         1360  
  70         1450  
440             extends 'MongoDB::Error';
441              
442             #--------------------------------------------------------------------------#
443             # Private error classes
444             #--------------------------------------------------------------------------#
445             package MongoDB::_CommandSizeError;
446 70     70   16264 use Moo;
  70         1233  
  70         251  
447 70         457 use MongoDB::_Types qw(
448             Intish
449 70     70   17433 );
  70         139  
450 70     70   66218 use namespace::clean;
  70         139  
  70         239  
451              
452             extends("MongoDB::Error");
453              
454             has size => (
455             is => 'ro',
456             isa => Intish,
457             required => 1,
458             );
459              
460             1;
461              
462             =pod
463              
464             =encoding UTF-8
465              
466             =head1 NAME
467              
468             MongoDB::Error - MongoDB Driver Error classes
469              
470             =head1 VERSION
471              
472             version v2.2.2
473              
474             =head1 SYNOPSIS
475              
476             use MongoDB::Error;
477             MongoDB::Error->throw("a generic error");
478             MongoDB::DatabaseError->throw(
479             message => $string,
480             result => $hashref,
481             );
482              
483             =head1 DESCRIPTION
484              
485             This class defines a hierarchy of exception objects.
486              
487             =head1 USAGE
488              
489             Unless otherwise explicitly documented, all driver methods throw exceptions if
490             an error occurs.
491              
492             To catch and handle errors, the L and L modules
493             are recommended:
494              
495             use Try::Tiny;
496             use Safe::Isa; # provides $_isa
497              
498             try {
499             $coll->insert( $doc )
500             }
501             catch {
502             if ( $_->$_isa("MongoDB::DuplicateKeyError" ) ) {
503             ...
504             }
505             else {
506             ...
507             }
508             };
509              
510             To retry failures automatically, consider using L.
511              
512             =head1 EXCEPTION HIERARCHY
513              
514             MongoDB::Error
515             |
516             |->MongoDB::AuthError
517             |
518             |->MongoDB::ConnectionError
519             | |
520             | |->MongoDB::HandshakeError
521             | |
522             | |->MongoDB::NetworkError
523             |
524             |->MongoDB::ConfigurationError
525             |
526             |->MongoDB::DatabaseError
527             | |
528             | |->MongoDB::CursorNotFoundError
529             | |
530             | |->MongoDB::DuplicateKeyError
531             | |
532             | |->MongoDB::NotMasterError
533             | |
534             | |->MongoDB::WriteError
535             | |
536             | |->MongoDB::WriteConcernError
537             |
538             |->MongoDB::DecodingError
539             |
540             |->MongoDB::DocumentError
541             |
542             |->MongoDB::GridFSError
543             |
544             |->MongoDB::InternalError
545             |
546             |->MongoDB::InvalidOperationError
547             |
548             |->MongoDB::ProtocolError
549             |
550             |->MongoDB::SelectionError
551             |
552             |->MongoDB::TimeoutError
553             | |
554             | |->MongoDB::ExecutionTimeout
555             | |
556             | |->MongoDB::NetworkTimeout
557             |
558             |->MongoDB::UsageError
559              
560             All classes inherit from C.
561              
562             All error classes have the attribute:
563              
564             =over 4
565              
566             =item *
567              
568             message — a text representation of the error
569              
570             =back
571              
572             =head2 MongoDB::AuthError
573              
574             This error indicates a problem with authentication, either in the underlying
575             mechanism or a problem authenticating with the server.
576              
577             =head2 MongoDB::ConnectionError
578              
579             Errors related to network connections.
580              
581             =head3 MongoDB::HandshakeError
582              
583             This error is thrown when a connection has been made, but SSL or authentication
584             handshakes fail.
585              
586             =head3 MongoDB::NetworkError
587              
588             This error is thrown when a socket error occurs, when the wrong number of bytes
589             are read, or other wire-related errors occur.
590              
591             =head2 MongoDB::ConfigurationError
592              
593             This error is thrown when there is a configuration error between the MongoDB
594             deployment and the configuration of the client, such as when trying to use
595             explicit sessions on a MongoDB < 3.6
596              
597             =head2 MongoDB::CursorNotFoundError
598              
599             This error indicates that a cursor timed out on a server.
600              
601             =head2 MongoDB::DatabaseError
602              
603             Errors related to database operations. Specifically, when an error of this type
604             occurs, the driver has received an error condition from the server.
605              
606             Attributes include:
607              
608             =over 4
609              
610             =item *
611              
612             result — response from a database command; this must implement the C method
613              
614             =item *
615              
616             code — numeric error code; see L; if no code was provided by the database, the C code will be substituted instead
617              
618             =back
619              
620             =head3 MongoDB::DuplicateKeyError
621              
622             This error indicates that a write attempted to create a document with a
623             duplicate key in a collection with a unique index. The C attribute is
624             a result object.
625              
626             =head3 MongoDB::NotMasterError
627              
628             This error indicates that a write or other state-modifying operation was
629             attempted on a server that was not a primary. The C attribute is
630             a L object.
631              
632             =head3 MongoDB::WriteError
633              
634             Errors indicating failure of a write command. The C attribute is
635             a result object.
636              
637             =head3 MongoDB::WriteConcernError
638              
639             Errors indicating failure of a write concern. The C attribute is a
640             result object.
641              
642             =head2 MongoDB::DecodingError
643              
644             This error indicates a problem during BSON decoding; it wraps
645             the error provided by the underlying BSON encoder. Note: Encoding errors
646             will be thrown as a L.
647              
648             =head2 MongoDB::DocumentError
649              
650             This error indicates a problem with a document to be inserted or replaced into
651             the database, or used as an update document.
652              
653             Attributes include:
654              
655             =over 4
656              
657             =item *
658              
659             document — the document that caused the error
660              
661             =back
662              
663             =head2 MongoDB::GridFSError
664              
665             Errors related to GridFS operations, such a corrupted file.
666              
667             =head2 MongoDB::InternalError
668              
669             Errors that indicate problems in the driver itself, typically when something
670             unexpected is detected. These should be reported as potential bugs.
671              
672             =head2 MongoDB::ProtocolError
673              
674             Errors related to the MongoDB wire protocol, typically problems parsing a
675             database response packet.
676              
677             =head2 MongoDB::SelectionError
678              
679             When server selection fails for a given operation, this is thrown. For example,
680             attempting a write when no primary is available or reading with a specific mode
681             and tag set and no servers match.
682              
683             =head2 MongoDB::TimeoutError
684              
685             These errors indicate a user-specified timeout has been exceeded.
686              
687             =head3 MongoDB::ExecutionTimeout
688              
689             This error is thrown when a query or command fails because C has
690             been reached. The C attribute is a L object.
691              
692             =head3 MongoDB::NetworkTimeout
693              
694             This error is thrown when a network operation exceeds a timeout, typically
695             C or C.
696              
697             =head2 MongoDB::UsageError
698              
699             Indicates invalid arguments or configuration options. Not all usage errors
700             will throw this — only ones originating directly from the MongoDB::* library
701             files. Some type and usage errors will originate from the L
702             library if the objects are used incorrectly.
703              
704             Also used to indicate usage errors for transaction commands.
705              
706             =head1 ERROR CODES
707              
708             The following error code constants are automatically exported by this module.
709              
710             BAD_VALUE => 2,
711             UNKNOWN_ERROR => 8,
712             NAMESPACE_NOT_FOUND => 26,
713             EXCEEDED_TIME_LIMIT => 50,
714             COMMAND_NOT_FOUND => 59,
715             WRITE_CONCERN_ERROR => 64,
716             NOT_MASTER => 10107,
717             DUPLICATE_KEY => 11000,
718             DUPLICATE_KEY_UPDATE => 11001, # legacy before 2.6
719             DUPLICATE_KEY_CAPPED => 12582, # legacy before 2.6
720             UNRECOGNIZED_COMMAND => 13390, # mongos error before 2.4
721             NOT_MASTER_NO_SLAVE_OK => 13435,
722             NOT_MASTER_OR_SECONDARY => 13436,
723             CANT_OPEN_DB_IN_READ_LOCK => 15927,
724              
725             This is a very, very small subset of error codes possible from the server,
726             but covers some of the more common ones seen by drivers.
727              
728             B:
729              
730             =over 4
731              
732             =item *
733              
734             Only C objects have a C attribute.
735              
736             =item *
737              
738             The database uses multiple write concern error codes. The driver maps them all to WRITE_CONCERN_ERROR for consistency and convenience.
739              
740             =back
741              
742             =head1 ERROR LABELS
743              
744             From MongoDB 4.0 onwards, errors may contain an error labels field. This field
745             is populated for extra information from either the server or the driver,
746             depending on the error.
747              
748             Known error labels include (but are not limited to):
749              
750             =over 4
751              
752             =item *
753              
754             C - added when network errors are encountered inside a transaction.
755              
756             =item *
757              
758             C - added when a transaction commit may not have been able to satisfy the provided write concern.
759              
760             =back
761              
762             =head1 AUTHORS
763              
764             =over 4
765              
766             =item *
767              
768             David Golden
769              
770             =item *
771              
772             Rassi
773              
774             =item *
775              
776             Mike Friedman
777              
778             =item *
779              
780             Kristina Chodorow
781              
782             =item *
783              
784             Florian Ragwitz
785              
786             =back
787              
788             =head1 COPYRIGHT AND LICENSE
789              
790             This software is Copyright (c) 2020 by MongoDB, Inc.
791              
792             This is free software, licensed under:
793              
794             The Apache License, Version 2.0, January 2004
795              
796             =cut
797              
798             __END__