--- DBI.pm.org	Wed Aug 21 21:09:27 2002
+++ DBI.pm	Thu Aug 22 07:17:22 2002
@@ -458,8 +458,12 @@
 	my @args = @_; $args[2] = '****'; # hide password
 	DBI->trace_msg("    -> $class->$connect_meth(".join(", ",@args).")\n");
     }
-    Carp::croak('Usage: $class->connect([$dsn [,$user [,$passwd [,\%attr]]]])')
-	if (ref $old_driver or ($attr and not ref $attr) or ref $pass);
+    if (ref $old_driver or ($attr and not ref $attr) or ref $pass) {
+        my $msg = 'Usage: $class->connect([$dsn [,$user [,$passwd [,\%attr]]]])';
+        $attr->{HandleError}->($msg, $class, undef)
+          if UNIVERSAL::isa($attr->{HandleError}, 'CODE');
+        Carp::croak($msg)
+    }
 
     # extract dbi:driver prefix from $dsn into $1
     $dsn =~ s/^dbi:(\w*?)(?:\((.*?)\))?://i
@@ -494,8 +498,14 @@
     }
     $attr = \%attr;	# now set $attr at our local copy
 
-    my $drh = $DBI::installed_drh{$driver} || $class->install_driver($driver)
-	or die "panic: $class->install_driver($driver) failed";
+    my $drh;
+    unless ($drh = $DBI::installed_drh{$driver} ||
+            $class->install_driver($driver)) {
+        my $msg = "panic: $class->install_driver($driver) failed";
+        $attr->{HandleError}->($msg, $class, $drh)
+          if UNIVERSAL::isa($attr->{HandleError}, 'CODE');
+        die $msg;
+    }
 
     ($user, $pass) = $drh->default_user($user, $pass, $attr)
 	if !(defined $user && defined $pass);
@@ -503,7 +513,9 @@
     unless ($dbh = $drh->$connect_meth($dsn, $user, $pass, $attr)) {
 	my $msg = "$class->connect($dsn) failed: ".$drh->errstr;
 	if (%attr) {
-	    # XXX add $attr{HandleError} logic here?
+	    # XXX add $attr{HandleError} logic here? Yes!
+            $attr->{HandleError}->($msg, $drh, $dbh)
+              if UNIVERSAL::isa($attr->{HandleError}, 'CODE');
 	    Carp::croak($msg) if $attr->{RaiseError};
 	    Carp::carp ($msg) if $attr->{PrintError};
 	}
