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 68     68   410996 use strict;
  68         178  
  68         1897  
16 68     68   379 use warnings;
  68         143  
  68         2179  
17              
18             package MongoDB::Error;
19              
20             # ABSTRACT: MongoDB Driver Error classes
21              
22             # Portions adapted from Throwable.pm by Ricardo Signes
23              
24 68     68   2335 use version;
  68         8826  
  68         378  
25              
26             our $VERSION = 'v2.2.0';
27              
28 68     68   8220 use Moo;
  68         60809  
  68         586  
29 68     68   27564 use Carp;
  68         180  
  68         4358  
30 68         901 use MongoDB::_Types qw(
31             ErrorStr
32 68     68   26974 );
  68         278  
33 68         431 use Types::Standard qw(
34             ArrayRef
35             Str
36 68     68   80353 );
  68         159  
37 68     68   55872 use Scalar::Util ();
  68         160  
  68         1018  
38 68     68   32023 use Sub::Quote ();
  68         299072  
  68         1660  
39 68     68   26403 use Safe::Isa;
  68         27507  
  68         9980  
40 68     68   680 use Exporter 5.57 qw/import/;
  68         1050  
  68         2455  
41 68     68   31176 use namespace::clean -except => ['import'];
  68         643778  
  68         1623  
42              
43             my $ERROR_CODES;
44              
45             BEGIN {
46 68     68   31456 $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 68     68   570 use constant $ERROR_CODES;
  68         159  
  68         21848  
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 728     728   14398 my $self = shift;
87 728         5628 return sprintf( "%s: %s", ref($self), $self->message );
88             },
89 68         925 fallback => 1
90 68     68   527 );
  68         151  
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 297     297 0 9340 my ($inv) = shift;
133              
134 297 50       1616 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 297         1377 local $_HORRIBLE_HACK{ERROR} = $@;
140              
141 297 100       7165 my $throwable = @_ == 1 ? $inv->new( message => $_[0] ) : $inv->new(@_);
142              
143 297         14880 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 68     68   76383 use Moo;
  68         186  
  68         615  
258 68         615 use MongoDB::_Types qw(
259             Numish
260 68     68   26417 );
  68         164  
261 68     68   73118 use namespace::clean;
  68         149  
  68         290  
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   6135 sub _build_code { return MongoDB::Error::UNKNOWN_ERROR() }
278              
279 0     0     sub _is_resumable { 0 }
280              
281             package MongoDB::DocumentError;
282              
283 68     68   21829 use Moo;
  68         158  
  68         299  
284 68     68   20382 use Types::Standard qw(Any);
  68         175  
  68         1688  
285 68     68   48410 use namespace::clean;
  68         234  
  68         288  
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 68     68   18016 use Moo;
  68         187  
  68         319  
298 68     68   19040 use Types::Standard qw(Str);
  68         155  
  68         300  
299 68     68   31185 use namespace::clean -except => 'meta';
  68         160  
  68         710  
300              
301             extends("MongoDB::Error");
302              
303             use overload (
304             q{""} => sub {
305 35     35   3584 my $self = shift;
306 35         728 return sprintf( "%s: %s%s", ref($self), $self->message, $self->trace );
307             },
308 68         488 fallback => 1
309 68     68   20547 );
  68         140  
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 68     68   14912 use Moo;
  68         150  
  68         381  
335 68     68   18522 use namespace::clean;
  68         234  
  68         264  
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 68     68   17780 use Moo;
  68         153  
  68         253  
343 68     68   19929 use namespace::clean;
  68         175  
  68         321  
344             extends 'MongoDB::ConnectionError';
345              
346             package MongoDB::NetworkError;
347 68     68   17822 use Moo;
  68         1587  
  68         306  
348 68     68   21361 use namespace::clean;
  68         173  
  68         344  
349             extends 'MongoDB::ConnectionError';
350              
351             # Timeout errors
352             package MongoDB::TimeoutError;
353 68     68   16699 use Moo;
  68         156  
  68         281  
354 68     68   20537 use namespace::clean;
  68         191  
  68         341  
355             extends 'MongoDB::Error';
356              
357 0     0     sub __is_retryable_error { 1 }
358              
359             package MongoDB::ExecutionTimeout;
360 68     68   19719 use Moo;
  68         180  
  68         296  
361 68     68   24489 use namespace::clean;
  68         160  
  68         345  
362             extends 'MongoDB::TimeoutError';
363              
364             package MongoDB::NetworkTimeout;
365 68     68   16582 use Moo;
  68         162  
  68         1657  
366 68     68   24309 use namespace::clean;
  68         144  
  68         332  
367             extends 'MongoDB::TimeoutError';
368              
369             # Database errors
370             package MongoDB::DuplicateKeyError;
371 68     68   17881 use Moo;
  68         167  
  68         1470  
372 68     68   22404 use namespace::clean;
  68         185  
  68         317  
373             extends 'MongoDB::DatabaseError';
374 0     0     sub _build_code { return MongoDB::Error::DUPLICATE_KEY() }
375              
376             package MongoDB::NotMasterError;
377 68     68   17788 use Moo;
  68         155  
  68         1997  
378 68     68   19689 use namespace::clean;
  68         154  
  68         316  
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 68     68   19136 use Moo;
  68         211  
  68         300  
385 68     68   21637 use namespace::clean;
  68         180  
  68         281  
386             extends 'MongoDB::DatabaseError';
387              
388             package MongoDB::WriteConcernError;
389 68     68   16532 use Moo;
  68         182  
  68         287  
390 68     68   20905 use namespace::clean;
  68         177  
  68         325  
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 68     68   18414 use Moo;
  68         145  
  68         309  
397 68     68   20088 use namespace::clean;
  68         177  
  68         294  
398             extends 'MongoDB::Error';
399              
400             package MongoDB::ConfigurationError;
401 68     68   16816 use Moo;
  68         172  
  68         338  
402 68     68   19481 use namespace::clean;
  68         228  
  68         299  
403             extends 'MongoDB::Error';
404              
405             package MongoDB::CursorNotFoundError;
406 68     68   16623 use Moo;
  68         1515  
  68         343  
407 68     68   20168 use namespace::clean;
  68         167  
  68         325  
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 68     68   20294 use Moo;
  68         191  
  68         332  
414 68     68   19912 use namespace::clean;
  68         186  
  68         329  
415             extends 'MongoDB::Error';
416              
417             package MongoDB::GridFSError;
418 68     68   18201 use Moo;
  68         177  
  68         306  
419 68     68   19992 use namespace::clean;
  68         142  
  68         1566  
420             extends 'MongoDB::Error';
421              
422             package MongoDB::InternalError;
423 68     68   16742 use Moo;
  68         161  
  68         324  
424 68     68   22679 use namespace::clean;
  68         156  
  68         299  
425             extends 'MongoDB::Error';
426              
427             package MongoDB::ProtocolError;
428 68     68   16764 use Moo;
  68         170  
  68         284  
429 68     68   20117 use namespace::clean;
  68         157  
  68         1765  
430             extends 'MongoDB::Error';
431              
432             package MongoDB::SelectionError;
433 68     68   18091 use Moo;
  68         1595  
  68         1703  
434 68     68   19745 use namespace::clean;
  68         1475  
  68         305  
435             extends 'MongoDB::Error';
436              
437             package MongoDB::InvalidOperationError;
438 68     68   16139 use Moo;
  68         1479  
  68         2981  
439 68     68   23766 use namespace::clean;
  68         199  
  68         3119  
440             extends 'MongoDB::Error';
441              
442             #--------------------------------------------------------------------------#
443             # Private error classes
444             #--------------------------------------------------------------------------#
445             package MongoDB::_CommandSizeError;
446 68     68   17804 use Moo;
  68         165  
  68         1648  
447 68         516 use MongoDB::_Types qw(
448             Intish
449 68     68   20135 );
  68         199  
450 68     68   70712 use namespace::clean;
  68         140  
  68         258  
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.0
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) 2019 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__