--- DBI.pm.org  Wed Aug 21 21:09:27 2002
+++ DBI.pm      Wed Aug 21 21:55:47 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 ref $attr and $attr->{HandleError};
+        Carp::croak($msg)
+    }
 
     # extract dbi:driver prefix from $dsn into $1
     $dsn =~ s/^dbi:(\w*?)(?:\((.*?)\))?://i
@@ -494,8 +498,13 @@
     }
     $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 $attr->{HandleError};
+        die $msg;
+    }
 
     ($user, $pass) = $drh->default_user($user, $pass, $attr)
        if !(defined $user && defined $pass);
@@ -503,7 +512,8 @@
     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 $attr->{HandleError};
            Carp::croak($msg) if $attr->{RaiseError};
            Carp::carp ($msg) if $attr->{PrintError};
        }
