internal/fetch: clarify loadPackage error handling

Improve the control flow when loadPackageWithBuildContext
returns an error. List the cases clearly.

For golang/go#37232

Change-Id: I09d7b1abfc4e933c540e5f7df8b715219db12457
Reviewed-on: https://go-review.googlesource.com/c/pkgsite/+/289672
Trust: Jonathan Amsterdam <jba@google.com>
Run-TryBot: Jonathan Amsterdam <jba@google.com>
Reviewed-by: Julie Qiu <julie@golang.org>
diff --git a/internal/fetch/load.go b/internal/fetch/load.go
index 0f7edbc..eea5463 100644
--- a/internal/fetch/load.go
+++ b/internal/fetch/load.go
@@ -70,11 +70,23 @@
 
 	for _, bc := range internal.BuildContexts {
 		pkg, err := loadPackageWithBuildContext(ctx, bc.GOOS, bc.GOARCH, files, innerPath, sourceInfo, modInfo)
-		if err != nil && !errors.Is(err, godoc.ErrTooLarge) && !errors.Is(err, derrors.NotFound) {
-			return nil, err
-		}
-		if pkg != nil {
+		switch {
+		case errors.Is(err, derrors.NotFound):
+			// No package for this build context.
+			continue
+		case errors.Is(err, godoc.ErrTooLarge):
+			// pkg should be non-nil. Remember the error and return the package
+			// for this build context; ignore the others.
+			if pkg == nil {
+				return nil, errors.New("unexpected nil package")
+			}
 			pkg.err = err
+			return pkg, nil
+		case err != nil:
+			// Serious error. Fail.
+			return nil, err
+		default:
+			// No error. Remember the package.
 			pkgs = append(pkgs, pkg)
 		}
 	}